单线程上传
服务端:
public static void main(String[] args) {
try ( // 创建一个ServerSocket监听8080端口的客户端请求
ServerSocket server = new ServerSocket(8000);
// 使用accept()阻塞当前线程,等待客户端请求
Socket socket = server.accept();
// 由Socket获得输入流,并创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Pictures\\m66.png")) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次从Socket读取数据
int len = in.read(buffer);
while (len != -1) {
// 写入数据到文件
out.write(buffer, 0, len);
// 再次从Socket读取数据
len = in.read(buffer);
}System.out.println("接收完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
客户端:
/**
* @Author he
* @Description 测试Socket上传文件的客户端
* @Date 8.22
**/
public class UdpClient {
public static void main(String[] args) {
try ( // 向本机的8080端口发出请求
Socket socket = new Socket("127.0.0.1", 8000);
// 由Socket获得输出流,并创建缓冲输出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
// 创建文件输入流
FileInputStream fin = new FileInputStream("C:\\Users\\14172\\Pictures\\m11.png");
// 由文件输入流创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次读取文件
int len = in.read(buffer);
while (len != -1) {
// 数据写入Socket
out.write(buffer, 0, len);
// 再次读取文件
len = in.read(buffer);
}
System.out.println("上传成功!");
} catch (
ConnectException e) {
System.out.println("服务器未启动!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
查看文件:
可以看到自己的目录下已经出现了C:\Users\14172\Pictures\m66.png
多线程上传
改成多线程的形式:
修改服务端:
public class isStream {
public static void main(String[] args)throws Exception {
ServerSocket server = new ServerSocket(8000);// 创建一个ServerSocket监听8080端口的客户端请求
// 使用accept()阻塞当前线程,等待客户端请求
while (true) //(2)开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道
{
Socket socket = server.accept();
new ServerReadThread(socket).start();
}
}
class ServerReadThread extends Thread {
static int number = 0;
private Socket socket;
public ServerReadThread(Socket socket) {
this.socket = socket;
}
@Override
public void run(){
try(
// 由Socket获得输入流,并创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流
FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\socket\\"+number+".png"))
{
number++;
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次从Socket读取数据
int len = in.read(buffer);
while (len != -1) {
// 写入数据到文件
out.write(buffer, 0, len);
// 再次从Socket读取数据
len = in.read(buffer);
System.out.println("接收完成!");
}
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
查看结果:
修改客户端
修改为用户输入图片路径,进行多次上传图片:
public class UdpClient {
public static void main(String[] args) throws IOException {
int num = 0;
Socket socket = new Socket("127.0.0.1", 8000);
// 由Socket获得输出流,并创建缓冲输出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
// 创建文件输入流
while (true) {
num++;
try ( // 向本机的8080端口发出请求
//System.out.println("输入文件路径:");
FileInputStream fin = new FileInputStream(scanner.nextLine());
// 由文件输入流创建缓冲输入流
BufferedInputStream in = new BufferedInputStream(fin)) {
// 准备一个缓冲区
byte[] buffer = new byte[1024];
// 首次读取文件
int len = in.read(buffer);
while (len != -1) {
// 数据写入Socket
out.write(buffer, 0, len);
// 再次读取文件
len = in.read(buffer);
}
System.out.println("上传成功!");
} catch (ConnectException e) {
System.out.println("服务器未启动!");
} catch (IOException e) {
e.printStackTrace();
}
if(num == 5) break;
}
}
}
查看目录:
发现一个小问题:已经存在的一样的命名的图片不会覆盖
然后有的图片传过去之后格式会损坏,貌似是jpg转为png命名的时候