目标:支持任意类型文件形式的上传
客户端实现
public class Client {
public static void main(String[] args) {
try (
InputStream is = new FileInputStream("D:\\文件\\java.png");
) {
// 1、请求与服务端的Socket链接
Socket socket = new Socket("127.0.0.1", 8888);
// 2、把字节输出流包装成一个数据输出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 3、先发送上传文件的后缀给服务端(这里应该自动截取文件后缀,我就直接写死了)
dos.writeUTF(".png");
// 4、把文件数据发送给服务端进行接收
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) > 0) {
dos.write(buffer, 0, len);
}
dos.flush();
socket.shutdownOutput(); // 通知服务端这边的数据发送完毕了
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端线程处理类
public class ServerReaderThread implements Runnable {
private Socket socket;
public ServerReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 1、得到一个数据输入流读取客户端发送过来的数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
// 2、读取客户端发送过来的文件类型
String suffix = dis.readUTF();
System.out.println("服务端已经成功接收到了文件类型:" + suffix);
// 3、定义一个字节输出管道负责把客户端发来的文件数据写出去
OutputStream os = new FileOutputStream("D:\\文件接收\\" +UUID.randomUUID() + suffix);
// 4、从数据输入流中读取文件数据,写出到字节输出流中去
byte[] buffer = new byte[1024];
int len;
while ((len = dis.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
os.flush();
os.close();
System.out.println("服务端接收文件保存成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端实现
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
while (true) {
Socket socket = ss.accept();
// 交给一个独立的线程来处理与这个客户端的文件通信需求。
new Thread(new ServerReaderThread(socket)).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
小结
实现起来并没有什么难度,客户端怎么发,服务端就怎么接收。