Java基础 TCP网络通信编程-文件传输

应用案例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();


    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值