HSP-TCP网络通信编程案例(UPLOAD)

本文详细介绍了如何使用HSP-TCP协议进行文件上传和接收的Java编程实现,涉及StreamUtils工具类和Server端、Client端的代码示例。
摘要由CSDN通过智能技术生成

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();
    }
}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.EVA.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值