HSP-TCP网络通信编程(上传文件)
用到的工具包 StreamUtils.java
package com.evaStudy.encap.API;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author EVA LEE
* @version 1.0
* @time 16/1/2024 9:36 pm
*/
public class StreamUtils {
//功能: 将输入流转换成 byte[] 即可以把文件的内容读入到 byte[]
public static byte[] streamToByteArray(InputStream is) throws Exception {
// 创建输出流对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 字节数组
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
// 循环读取
// 把读取到的数据,写入 bos
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}
public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}
Sever端:
package com.evaStudy.encap.API;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author EVA LEE
* @version 1.0
* @time 16/1/2024 7:38 pm
*/
public class TCPFileUploadServer {
/*
1. 编写一个服务端 和一个客户端
2. 服务器端在 8888端 监听
3. 客户端连接到服务端 发送一张图片
4. 服务器端接收到 客户端发送的图片 保存到src下 发送“收到图片” 再退出
5. 客户端接收到服务端发送的 “收到图片” 再退出
6. 该程序要求使用 StreamUtils.java
*/
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
//读取客户端发送的数据 通过Socket得到输入流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
//将得到的 bytes数组 写入到指定的路径 就得到一个文件了
BufferedOutputStream bos = new BufferedOutputStream
(new FileOutputStream("/Users/eval/Desktop/2.png"));
bos.write(bytes);
bos.close();
//向客户端回复 “收到图片” 通过socket 获取到输出流(字符)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("copy successfully!");
bw.flush();//把内容刷新到数据通道
socket.shutdownOutput();//设置写入结束标记
//关闭其他资源
bw.close();
bis.close();
socket.close();
serverSocket.close();
}
}
Client端:
package com.evaStudy.encap.API;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author EVA LEE
* @version 1.0
* @time 16/1/2024 7:38 pm
*/
public class TCPUploadClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
//创建读取磁盘文件的输入流 将磁盘上的图片 读到文件字节数组里面
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("/Users/eval/Desktop/1.png"));
//bytes 就是文件对应的 字节数组
byte[] bytes = StreamUtils.streamToByteArray(bis);
//通过 socket获取到输出流 将bytes数据发送给服务端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes);//将文件对应的字节数组的内容 写入到数据通道
bis.close();
socket.shutdownOutput();//设置 写入数据的结束标记
//接受从服务端回复的消息
InputStream inputStream = socket.getInputStream();
String s = StreamUtils.streamToString(inputStream);
System.out.println(s);
inputStream.close();
bos.close();
socket.close();
}
}