上一篇中说的是单线程实现的文件上传,接下来说说多线程实现文件上传
首先搞清楚应该是对于服务器端的多线程,因为是多个客户端同时向服务器端上传
编写客户端代码,先读取本地文件,然后给服务器端发送数据,最后接收一下是否上传成功
//实现图片上传的客户端
Socket socket = new Socket(InetAddress.getByName("10.0.185.144"),44444);
//读取本地图片的字节读取流
FileInputStream fis = new FileInputStream("new.jpg");
//给服务器端发送数据的字节输出流
OutputStream out = socket.getOutputStream();
//读取"上传成功"的字节读取流
InputStream in = socket.getInputStream();
//循环读取本地图片,发送给服务器端
byte[] arr = new byte[1024];
int len = 0;
while((len = fis.read(arr))!=-1)
{
out.write(arr,0,len);
}
//向服务器写入结束标记
socket.shutdownOutput();
//读取"上传成功"
int num = in.read(arr);
System.out.println(new String(arr,0,num));
fis.close();
socket.close();
接下来是服务器端
首先要创建一个实现了Runnable或者继承了Thread(因为实现Runnable的方式,线程和线程任务是分离的,所以我使的是这种方式)的类将每次都要执行的代码写到run方法中,然后创建一个线程去执行就可以了
class PicUpload implements Runnable
{
private Socket socket;
public PicUpload(Socket socket)
{
this.socket = socket;
}
public void run()
{
try{
//把上传的图片放到统一的目录下
File dir = new File("pictures");
if(!dir.exists())
dir.mkdir();
String ip = socket.getInetAddress().getHostAddress();
System.out.println(ip+"连接到客户端");
int num = 0;
File file = new File(dir,ip+(++num)+".jpg");
while(file.exists())
{
file = new File(dir,ip+(++num)+".jpg");
}
FileOutputStream fos = new FileOutputStream(file);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] arr = new byte[1024];
int len = 0;
while((len = in.read(arr))!=-1)
{
fos.write(arr,0,len);
}
fos.close();
out.write("上传成功".getBytes());
socket.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
写一下服务器端
class Test
{
public static void main(String[] args)throws IOException
{
ServerSocket server = new ServerSocket(44444);
while(true)
{
Socket socket = server.accept();
new Thread(new PicUpload(socket)).start();
}
}
}
这样就可以实现多个客户端同时向服务器端上传文件了