上传图片到服务器
import java.io.*;
import java.net.*;
class PicClient
{
public static void main(String[] args) throws Exception
{
//创建socket服务和连接
Socket s=new Socket("localhost",10000);
//确定要操作的文件对象
FileInputStream fis=new FileInputStream("1.jpg");
//获得客户端的输出流对象。
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024];
int len=0;
//循环将文件对象数据写入到客户端输出流。
while((len=fis.read(buf))!=-1){
os.write(buf,0,len);
}
//设定输出流结束标识
s.shutdownOutput();
//获取客户端输入流对象。
InputStream is=s.getInputStream();
byte[] bufResult=new byte[1024];
int lens=0;
//获取服务端发送到客户端输入流中的数据
lens=is.read(bufResult);
System.out.println(new String(bufResult,0,lens));
fis.close();
s.close();
}
}
class PicServer
{
public static void main(String[] args)throws Exception{
//建立服务器端服务,监听10000端口
ServerSocket ss=new ServerSocket(10000);
//获取连接到服务器的客户端
Socket s=ss.accept();
//获取ip并打印。
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected.");
//获取输入流对象,取得客户端发送过来的数据。
InputStream is=s.getInputStream();
//设定上传文件保存的文件名
FileOutputStream fos=new FileOutputStream("server.jpg");
int len=0;
byte[] buf=new byte[1024];
//循环读取输入流中的数据并写入到文件输出流。
while((len=is.read(buf))!=-1){
fos.write(buf,0,len);
}
//上传成功后向客户端反馈信息。
OutputStream os=s.getOutputStream();
//将字符串转换为字节并写入到输出流
os.write("picture upload sucess.".getBytes());
//关闭资源。
fos.close();
s.close();
ss.close();
}
}
并发上传图片
需求:
1.允许多个客户端同时上传文件
2.在上传文件前需对文件进行判断(文件后缀,文件大小等...)
import java.io.*;
import java.net.*;
class PicClient
{
public static void main(String[] args) throws Exception
{
//创建socket服务和连接
Socket s=new Socket("localhost",10000);
//参数判断
if(args.length!=1){
System.out.println("参数个数不对!");
}
File PicFile=new File(args[0]);
//在对文件操作前需先判断文件是否存在,以及传递过来的是是否为文件。
if(!(PicFile.exists()&&PicFile.isFile())){
System.out.println("文件不存在或者不是文件");
}
//过滤文件格式
if(!(PicFile.getName().endsWith(".jpg"))){
System.out.println("不是jpg格式的文件");
}
//过滤文件大小。
if(PicFile.length()>1024*1024*4){
System.out.println("文件太大。");
}
//确定要操作的文件对象
FileInputStream fis=new FileInputStream(PicFile);
//获得客户端的输出流对象。
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024];
int len=0;
//循环将文件对象数据写入到客户端输出流。
while((len=fis.read(buf))!=-1){
os.write(buf,0,len);
}
//设定输出流结束标识
s.shutdownOutput();
//获取客户端输入流对象。
InputStream is=s.getInputStream();
byte[] bufResult=new byte[1024];
int lens=0;
//获取服务端发送到客户端输入流中的数据
lens=is.read(bufResult);
System.out.println(new String(bufResult,0,lens));
fis.close();
s.close();
}
}
class PicServer
{
public static void main(String[] args)throws Exception{
//建立服务器端服务,监听10000端口
ServerSocket ss=new ServerSocket(10000);
//获取连接到服务器的客户端
while(true){
Socket s=ss.accept();
new Thread(new PicThread(s)).start();
}
}
}
class PicThread implements Runnable
{
private Socket s;
//输出文件名
private File picFile;
PicThread(Socket s){
this.s=s;
}
public void run(){
int PicCount=1;
try{
//获取ip并打印。
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected.");
//获取输入流对象,取得客户端发送过来的数据。
InputStream is=s.getInputStream();
//设定上传文件保存的文件名
picFile=new File(ip+"("+PicCount+").jpg");
//循环判断,如果文件名已经存在,则PicCount加1
while(picFile.exists()){
picFile=new File(ip+"("+(PicCount++)+").jpg");
}
FileOutputStream fos=new FileOutputStream(picFile);
int len=0;
byte[] buf=new byte[1024];
//循环读取输入流中的数据并写入到文件输出流。
while((len=is.read(buf))!=-1){
fos.write(buf,0,len);
}
//上传成功后向客户端反馈信息。
OutputStream os=s.getOutputStream();
//将字符串转换为字节并写入到输出流
os.write("picture upload sucess.".getBytes());
//关闭资源。
fos.close();
s.close();
}
catch(Exception e){
throw new RuntimeException("uplaod error.");
}
}
}
用户登录
/*
** 需求,客户端登录服务器
** 1.客户端从键盘输入用户名,然后发送到服务器验证,若验证成功,客户端打印“欢迎...”
** 服务器端打印用户已经登录;若验证失败,客户端打印没有该用户,服务器端打印用户尝试登录
** 2.客户端只有三次的机会尝试登录服务器。
*/
import java.io.*;
import java.net.*;
/*
** 客户端
*/
class LoginClient
{
public static void main(String[] args) throws Exception
{
//建立socket服务,并连接主机及端口10003
Socket s=new Socket("localhost",10003);
/*
** 客户端获取用户名
*/
//建立缓存,读取键盘输入。
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//打印客户端输出流中的信息,并自动刷新。
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//读取客户端输入流中的信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//存储键盘输入的行信息。
String line=null;
//行长度
int len=0;
//允许输入三次。
for(int x=0;x<3;x++){
//获取行数据。
line=bufr.readLine();
//在对行数据操作前先判断行数据是否为空,若为空则直接退出。
if(line==null)
break;
//将获取的行数据(用户名)发送到服务器。
pw.println(line);
/*
** 获取服务器发送到客户端的消息。
*/
String str=bufIn.readLine();
//若服务器发送的消息中含有“欢迎”则表示登录成功。
if(str.contains("欢迎")){
System.out.println(str);
break;
}
else{
System.out.println("用户名不存在");
}
}
//关闭资源。
bufr.close();
s.close();
}
}
/*
** 服务器
*/
class LoginServer
{
public static void main(String[] args)throws Exception{
//建立serverSocket服务,并监听端口10003
ServerSocket ss=new ServerSocket(10003);
//建立循环,允许多个客户端同时登录
while(true){
//获取连接到服务器的客户端。
Socket s=ss.accept();
//为每一个连接到服务器的客户端建立线程,并启动。
new Thread(new UserLogin(s)).start();
}
}
}
class UserLogin implements Runnable
{
private Socket s;
UserLogin(Socket s){
this.s=s;
}
public void run(){
//获取ip地址,以判断是否连接。
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected.");
try{
//服务端只接收3次客户端发送过来的消息。
for(int x=0;x<3;x++){
//获取用户数据对象。
BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));
//获取服务端输入流信息。
BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String userName=null;
String str=null;
boolean flag=false;
//从输入端获取行数据(用户名)
userName=bufIn.readLine();
//在对用户名操作前先判断用户名是否有效。
if(userName==null){
break;
}
//判断用户名是否在用户数据库中。
while((str=bufr.readLine())!=null){
//如果存在则将标识置位
if(userName.equals(str)){
//表示获得用户信息。
flag=true;
break;
}
}
if(flag){
//将如下消息发送到客户端。
pw.println(userName+":欢迎您");
//如下信息将在客户端显示。
System.out.println(ip+":"+userName+":已经登录");
//一旦该客户端登录成功则退出登录界面。
break;
}
else{
pw.println(userName+"不存在");
System.out.println(ip+":"+userName+":尝试登录");
}
}
s.close();
}
catch(Exception e){
//e.toString()可有效反馈出错信息。
throw new RuntimeException(e.toString());
}
}
}
出错信息中直接打印e.toString()可直接获取出错的详细信息。用户判断只能三次,一旦判断成功则将登录成功标识位置位。