Java入门--Socket文件上传
一. socket客户端
package io.github.wangermaizi.day10;
// 基于TCP的文件上传
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPUploadClient {
public static void main(String[] args) throws IOException {
// 1. 获取本地文件资源
FileInputStream fis = new FileInputStream("C:\\Users\\LSY\\Desktop\\sys_path.txt");
// 2. 创建 socket 客户端
Socket socketClient = new Socket("127.0.0.1", 8888);
// 3. 向socket 输出本地资源
OutputStream ops = socketClient.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
// fis.read(bytes) 读取本地字节资源, 直到读取到 -1 结束, 但是程序并不会读取到-1
// 此时, 程序读取不到结束标记就是进入阻塞状态, 等待结束标记, 后续代码均不会执行
while ((len = fis.read(bytes)) != -1 ) {
// 循环读取本地资源, 并往socket输出流
ops.write(bytes,0, len);
}
/*
* 解决方案:
* 使用 socket对象的 shutdownOutput() 停止输出流
* */
socketClient.shutdownOutput();
// 读取结束之后要即时关闭文件资源
fis.close();
// 等待保存数据成功之后的响应内容 (也是流字节的形式)
InputStream ips = socketClient.getInputStream();
while ((len = ips.read(bytes))!= -1) {
System.out.println(new String(bytes, 0, len));
}
socketClient.shutdownInput();
socketClient.close();
}
}
二. socket服务端
package io.github.wangermaizi.day10;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// 基于TCP上传的服务端
public class TCPUploadServe {
public static void main(String[] args) throws IOException {
// 1. 读取socket传过来的资源
ServerSocket socketServe = new ServerSocket(8888);
// 与客户端建立标识符, 使用客户端的流做输入, 输出
Socket socketClient = socketServe.accept();
// 创建接收资源的流
InputStream ips = socketClient.getInputStream();
// 判断保存的文件是否存在, 不存在就自动创建一个
File file = new File("D:\\upload");
if (!file.exists()) {
// 不存在, 创建
file.mkdirs();
}
// 输出资源==>保存资源至本地 (文件资源在操作结束之后记得及时关闭)
FileOutputStream fos = new FileOutputStream(file+ "\\sys.txt");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = ips.read(bytes)) != -1) {
// 循环读取内容
fos.write(bytes, 0, len);
}
System.out.println("保存成功, 正在告知客户端");
// 保存成功之后告诉客户端保存成功
OutputStream ops = socketClient.getOutputStream();
ops.write("上传成功".getBytes());
// 文件写完之后要及时关闭文件资源
fos.close();
socketClient.close();
socketServe.close();
}
}
网友评论