通过Java Socket编程,实现多线程文件上传。主要涉及ServerScoket服务端、Socket客户端、IO流操作、多线线程。
客户端:
package learn.javase.Update;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 利用TCP的Socket\ServerSocket客户端向服务器上传文件
* 客户端
* @author Jole
*
*/
public class UpClent {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("127.0.0.1",8888);
OutputStream out = socket.getOutputStream();
//读取本地文件,并通过out输出流,发送给服务端
File file = new File("J:"+File.separator+"wxhandbook-master.zip");
FileInputStream in = new FileInputStream(file);
byte[] data = new byte[1024];
int len =0;
while((len=in.read(data))!=-1) {
out.write(data, 0, len);
}
socket.shutdownOutput();
//获取服务器返回信息
InputStream info = socket.getInputStream();
int infoSize=info.read(data);
System.out.println(new String(data, 0, infoSize));
info.close();
socket.close();
}
}
多线程实现类:
package learn.javase.Update;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* 改造为多线程,服务端
* @author Jole
*
*/
public class UpServerThread implements Runnable{
private Socket socket;
public UpServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//获取客户端输入流
InputStream in = socket.getInputStream();
//判断文件夹是否存在,不存在则新建
File file = new File("H:\\up");
if(!file.exists()) {
file.mkdir();
}
//设置文件名规则
String fileName = System.currentTimeMillis()+"_"+new Random().nextInt(9999)+".zip";
FileOutputStream out = new FileOutputStream(file+File.separator+fileName);
//读取客户端发送数据,并写入到H:\\up文件夹下面
byte[] data = new byte[1024];
int len = 0;
while((len=in.read(data))!=-1) {
out.write(data, 0, len);
}
//返回消息给客户端,上传成功信息
OutputStream outInfo = socket.getOutputStream();
outInfo.write("上传成功".getBytes());
outInfo.close();
out.close();
socket.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
服务端线程启动类:
package learn.javase.Update;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 启动服务器多线程
* @author Jole
*
*/
public class UpServerMainThread {
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(8888);
while(true) {
Socket socket = server.accept();
new Thread(new UpServerThread(socket)).start();
}
}
}
评论 (0)