Java多线程+网络编程模拟客户上传文件到服务器
程序员文章站
2022-07-10 17:07:00
...
先运行启动服务器端,再启动客户端, 如果服务器和客户端不在同一电脑上(正常也不会在同一电脑上),一定要在同一局域网下,客户端IP改为服务器电脑的IP即可
服务器运行完可以一直启动,客户就能一直往服务器发文件了,可以同时很多客户端同时上传文件,文件名相同的文件也不会被覆盖
服务器端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9999);
while (true) {
Socket socket = server.accept();
new Thread() {
@Override
public void run() {
FileOutputStream out = null;
try {
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
PrintStream ps = new PrintStream(socket.getOutputStream());
//1.读取上传的文件名
String filename = reader.readLine();
//2.发送一个开始上传的命令
ps.println("正在上传...");
//UUID可以生成一个不重复的字符串
String string = UUID.randomUUID().toString();
//2.不断的拷贝---->创建一个本地输出流
out = new FileOutputStream("D:\\接收文件" + string + "_" + filename);//填写路径要存在
//3.不断从客户端读取数据,通过out本地流将数据保存文件
byte[] arr = new byte[1024 * 8];
int len;
while ((len = in.read(arr)) != -1) {
out.write(arr, 0, len);
}
//回写客户端一个上传成功的字样
ps.println("上传成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
}
客户端代码
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 9999);
//因博主测试服务器端,客户端都在自己电脑上,所以这里ip填写为本机,端口号要和服务器一样
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
//0.关联要发送的文件
File file = new File("G:\\ftp\\美少女.jpg");//填写要上传的本地文件全路径
//1.发送自己要上传的文件名
ps.println(file.getName());
String s = reader.readLine();
System.out.println(s);
//2.拷贝文件了---->创建本地流关联file
FileInputStream in = new FileInputStream(file);
byte[] arr = new byte[1024 * 8];
int len;
while ((len = in.read(arr)) != -1) {
ps.write(arr, 0, len);
}
//2.1写一个结束标记
socket.shutdownOutput();
//3.读取上传成功的字样
String result = reader.readLine();
System.out.println(result);
in.close();
socket.close();
}
}
下一篇: 基于http协议的接口测试(1)