应用案例4 TCPFileCopy.java
1、编写一个服务端,和一个客户端
2、服务器端在8888端口监听
3、客户端连接到服务端,发送一张图片 e:\\qie.png
4、服务器端接收到客户端发送的图片,保存到src下,发送"收到图片"再退出
5、客户端接收到服务端发送的"收到图片",再退出
6、该程序要求使用StreamUtils.java
说明:使用BufferedInputStream和BufferedOutputStream字符流
import java.io.*;
/**
* @ClassName StreamUtils
* @Description 关于流的读写方法
* @Author 小黄debug
* @Date 2022/3/26 21:44
* @Version 1.0
**/
public class StreamUtils {
/**
* 功能:将输入流转换成byte[],即可以把文件的内容读入到byte[]
* @param is
* @return
* @throws IOException
*/
public static byte[] streamToByteArray(InputStream is) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象
byte[] b = new byte[1024]; //字节数组
int len;
while((len = is.read(b)) != -1){ //循环读取
bos.write(b,0,len); //把读取到的数据,写入到bos
}
byte[] array = bos.toByteArray();//然后将bos转成字节数组
bos.close();
return array;
}
/**
* 功能:将InputStream转换成String
* @param is
* @return
* @throws IOException
*/
public static String streamToString(InputStream is) throws IOException {
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();
}
}
java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* @ClassName TCPFileUploadClient
* @Description
* @Author 小黄debug
* @Date 2022/3/26 21:32
* @Version 1.0
**/
public class TCPFileUploadClient {
public static void main(String[] args) throws IOException {
//客户端连接服务端,得到Socket对象
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
//创建读取磁盘文件的输入流
String filePath = "e:\\qie.png";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
//bytes就是filePath对应的字节数组
byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);
//通过socket获取到输出流,将bytes数据发送给服务端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(bytes);//将文件对应的字节数组的内容,写入到数据通道
bufferedInputStream.close();
socket.shutdownOutput();//设置了写入数据结束标记
InputStream inputStream = socket.getInputStream();
// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
// String s = bufferedReader.readLine();
// System.out.println(s);
// bufferedReader.close();
String s = StreamUtils.streamToString(inputStream);
System.out.println(s);
inputStream.close();
//关闭相关的流
bos.close();
socket.close();
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @ClassName TCPFileUploadServer
* @Description
* @Author 小黄debug
* @Date 2022/3/26 21:32
* @Version 1.0
**/
public class TCPFileUploadServer {
public static void main(String[] args) throws IOException {
//1.服务端在本机监听8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端在8888端口监听");
//2.等待连接
Socket socket = serverSocket.accept();
//3.读取客户端发送的数据
//通过Socket得到输入流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
//4.将得到bytes数组,写入到指定的路径,就得到一个文件了
String destFilePath = "src\\qie2.png";
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.close();
//向客户端回复"收到图片"
//通过socket 获取输出流(字符)
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("收到图片");
writer.newLine();//结束标识
writer.flush();//将内容刷新到通道
writer.close();//关闭
//关闭其他资源
bis.close();
socket.close();
serverSocket.close();
}
}