socket通信实现TCP协议的同步通信

实现tcp通信,一般第一想到的是用netty框架,但是netty实现的通信一般是异步,发送消息后,不需要等到回复。

最近遇到一个需求时,与某个网关进行tcp通信,发送请求消息之后会立马回复,并且不同的请求命令,返回的回复数据内容也不相同。思考再三,决定不使用netty,使用socket进行通信,请求后等到回复,收到回复内容进行解析。


import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.HexUtil;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class TCPClient {

    public static Map<String, Socket> ipChannelMap = new ConcurrentHashMap<String, Socket>();

    public static void main(String[] args) {
        try {
            //连接服务器
            Socket socket = new Socket("192.168.11.11", 8889);
            //发送指令
            String request = "12313112";
            OutputStream out = socket.getOutputStream();
            out.write(HexUtil.decode(request));
            out.flush();
            //接收服务器返回指令
            InputStream in = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String response = new String(buffer, 0, len);
            String hexString = HexUtil.encodeToString(response);
            System.out.println("Client received: " + hexString);
            //断开服务器
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Title createSocket
    * @Description 建立socket连接
    * @param ip
    * @param port
    * @Author ju
    * @Return java.net.Socket
    * @Date: 2023/12/22 14:26
    */
    public static Socket createSocket(String ip,int port){
        //连接服务器
        Socket socket = null;
        try {
            socket = ipChannelMap.get(ip + ":" + String.valueOf(port));
            if (Func.isNull(socket)){
                socket = new Socket(ip, port);
                ipChannelMap.put(ip + ":" + String.valueOf(port),socket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return socket;
    }

    /**
    * @Title destroyConnect
    * @Description 断开socket连接
    * @param socket
    * @Author ju
    * @Return void
    * @Date: 2023/12/22 14:27
    */
    public static void destroyConnect(Socket socket){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Title send
    * @Description 发送请求指令并返回服务器的返回指令
    * @param socket
    * @param request
    * @Author ju
    * @Return java.lang.String
    * @Date: 2023/12/22 14:27
    */
    public static String send(Socket socket,String request){
        String response = "";
        try {
            OutputStream out = socket.getOutputStream();
            out.write(HexUtil.decode(request));
            out.flush();
            //接收服务器返回指令
            InputStream in = socket.getInputStream(   );
            byte[] buffer = new byte[1024];
            int len = in.read(buffer);
            String str = new String(buffer, 0, len);
            response = HexUtil.encodeToString(str);
            System.out.println("Client received: " + response);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

行云的逆袭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值