服务器端:
//多用户上传图片
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadPicServer1 {
public static void main(String[] args) throws IOException {
//创建TCP的socket服务
ServerSocket ss=new ServerSocket(8888);
//由于不是只有一个用户上传文件,所以循环接收客户端对象
while(true){
//接收客户端对象
Socket s=ss.accept();
//为每个客户端开启一个线程,每进来一个客户端就开启一个线程,
//用于上传文件
new Thread(new UploadTask1(s)).start();
}
}
}
使用多线程,处理接收数据的线程:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class UploadTask1 implements Runnable{
//读取的文件的最大大小
private static final int SIZE=1024*10;//定义最大容许10K
private Socket s;
public UploadTask1(Socket s) {
this.s=s;
}
@Override
public void run() {
//得到客户端的ip地址
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
int count=0;
//读取客户端发来的数据
try {
InputStream is=s.getInputStream();
//确定图片存储到服务器中的一个位置,也就是确定服务器的目标文件
//将图片放到一个文件夹下
File dir=new File("d:\\aa");
if(!dir.exists()){
//如果文件夹不存在则创建
dir.mkdir();
}
//关联目标文件对象,即将读取的内容存储到哪个文件中
//file对象不管文件存在与否,都可以关联,但不自动创建,只有与IO输出流关联往文件写入的时候,如果文件不存在,自动创建
//只要直接和IO输出流关联的文件如果不存在,会自动创建
File file=new File(dir,ip+".jpg");
//如果文件已经存在于客户端,可以一个客户端向服务器端多次发送数据
while(file.exists()){
file=new File(dir,ip+"("+(++count)+").jpg");
}
//file文件只有真正写的时候才会创建
//将IO流与文件进行关联
FileOutputStream fos=new FileOutputStream(file);
//定义缓冲区
byte[] buf=new byte[1024];
int len=0;
//is流进行读操作
while((len=is.read(buf))!=-1){//将输入流中的数据读取到buf数组中
//fos流进行写操作
fos.write(buf, 0, len);
//如果文件
if(file.length()>SIZE){
System.out.println(ip+"文件体积过大");
//文件体积过大,将流关闭,不进行上传
OutputStream os=s.getOutputStream();
os.write("文件上传失败".getBytes());
is.close();
fos.close();
s.close();
//将文件删除掉
//再删除文件之前,一定要把IO流都关闭掉,否则会出现文件删除失败的情况
System.out.println(ip+"..."+file.delete());
return;//return后面什么都没跟意味着程序的结束
}
}
//获取socket输出流,将上传成功提示发送给客户端
OutputStream os=s.getOutputStream();
os.write("文件上传成功".getBytes());
fos.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadPicClient1 {
public static void main(String[] args) throws UnknownHostException, IOException {
//1.创建socket客户端
Socket s=new Socket(InetAddress.getLocalHost(), 8888);
//2.读取客户端要上传的图片文件
//读取,所以需要定义输入流
FileInputStream fis=new FileInputStream("d:\\16.jpg");
//3.读取socket输出流,将读取到的图片数据发送给服务器
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[] b=new byte[1024];
int length=is.read(b);
String str=new String(b, 0, length);
System.out.println(str);
s.close();
}
}
注意:
1.file对象不管文件存在与否,都可以关联,但不自动创建,只有与IO输出流关联往文件写入的时候,如果文件不存在,自动创建。只要直接和IO输出流关联的文件如果不存在,会自动创建
2.再删除文件之前,一定要把IO流都关闭掉,否则会出现文件删除失败的情况。
3.先开启服务器端,在开启客户端。
运行结果为:
当所传文件小于10k时:
服务器端:
客户端:
当所传文件大于10k时:
服务器端:
客户端: