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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA:解析Event事件机制与应用举例

1、简述 Java事件机制是一种基于观察者模式的设计模式&#xff0c;用于处理对象之间的松耦合通信。本篇技术博客将深入探讨Java事件机制的原理&#xff0c;并通过实际应用举例展示如何在项目中灵活利用该机制。 2、基本原理 Java事件机制基于观察者模式&#xff0c;包含以下…

【AI视野·今日NLP 自然语言处理论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 1 Jan 2024 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Principled Gradient-based Markov Chain Monte Carlo for Text Generation Authors Li Du, Afra Amini, Lucas…

npm i sass -D的含义

命令 npm i sass -D 是一个在Node.js项目中使用npm&#xff08;Node Package Manager&#xff09;安装Sass预处理器的命令。这个命令的各个部分含义如下&#xff1a; npm: 这是Node Package Manager的缩写&#xff0c;一个用于Node.js的包管理和分发工具&#xff0c;允许开发者…

手把手教你学会接口自动化系列二-编写一个get接口

之前我们写了登录接口,对于登录的接口是post请求。 详见: 手把手教你学会接口自动化系列一-浅浅地尝试编写登录接口的自动化代码-CSDN博客 我们都知道接口最常用的两种类型是get和post类型,为了让知识完整性,我这节课演示下接口自动化如何请求get类型的接口,因为get类型…

C语言程序由哪些部分组成?

一、问题 一个C语言程序都由哪些部分组成? 它的基本单位是什么? 二、解答 一个 C语言程序可以由一个主函数和若干个函数构成。一个大的应用程序一般应该分为多个程序模块&#xff0c;每一个模块用来实现一个功能。实现这些模块功能的可以叫做子程序。 在 C 语言中&#xff…

职场必备技能2自动化办公excel操作

目录 一、介绍excel 二、应用场景&#xff1a;----可以完成什么操作 生活中遇见的场景 三、下载 四、excel模块 3.1、xlrd 语法&#xff1a; 案例&#xff1a; 算2020年与2021收入差距是多少 3.2、openpyxl 语法 案例1&#xff1a;计算一年的工资--12个月 案例2&…

探讨JS混淆技术及其加密解密实例

引言 在当前计算机科学领域中&#xff0c;保护软件代码的安全性和隐私性变得愈发重要。为了防止黑客攻击和恶意软件分析&#xff0c;开发人员采用各种技术来混淆和加密其代码&#xff0c;其中包括JS混淆技术。本文将介绍JS混淆技术的原理和应用&#xff0c;并提供一些相关的加密…

十、HTML 样式- CSS

CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。 一、实例 1、HTML使用样式 本例演示如何使用添加到 <head> 部分的样式信息对 HTML 进行格式化。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTM…

Spring Boot 和 Spring Framework 的区别

Spring Boot 和 Spring Framework (通常简称为 Spring) 有几个主要区别&#xff1a; 简化配置&#xff1a;Spring Boot 的一个主要目标是简化 Spring 应用的配置和启动过程。它提供了“约定优于配置”的原则&#xff0c;这意味着如果你遵循默认配置&#xff0c;你可以用更少的配…

用sql计算两个日期的间隔天数 ,去除周末

快递行业&#xff0c;经常需要计算2个节点的时效&#xff0c;有的计算自然日&#xff0c;有时候需要计算去掉周末的时效&#xff0c;计算自然日很简单&#xff0c;用函数datediff 就可以了&#xff0c;计算工作日时效&#xff0c;我的实现方法如下&#xff0c;借助了一个日期维…

多线程-生产者消费者模型

一、基本信息 1、场景介绍&#xff1a;厨师和吃货的例子&#xff0c;吃货吃桌子上的面条&#xff0c;吃完让厨师做&#xff0c;厨师做完面条放桌子上&#xff0c;让吃货吃&#xff0c;厨师如果发现桌子上有面条&#xff0c;就不做&#xff0c;吃货发现桌子上没有面条就不吃。 …

校招行测,认知能力测验,④破解数量关系测试题

数量关系&#xff0c;值得是数量计算、对比和分析&#xff0c;每种题型都有一定的规律性&#xff0c;如果善于终结也是容易掌握的&#xff0c;当然&#xff0c;只有见多&#xff0c;才能识广&#xff0c;最好的方式就是&#xff0c;锻炼&#xff0c;刷题&#xff0c;就算是临时…

socket从客户端向主机传输一个文件

client FileInputStream 是 Java 中用于从文件中读取字节流的类&#xff0c;它属于字节流的一部分。它主要用于读取原始的字节数据&#xff0c;例如图像、音频、文本文件等。FileInputStream 继承自 InputStream 类。 //将需要读取的文件变成可输出的流FileInputStream fileI…

QT应用篇:QT解析与生成XML文件的四种方式

四种常见的解析 XML 的方式(DOM、SAX、以及基于 Qt 的 XmlStreamReader)各有自己的优缺点,适合不同的应用场景。 DOM 适合小型且结构简单的 XML 文件,需要频繁修改和操作整个文档结构的情况。SAX 适合大型 XML 文件,以及只需读取不需要修改的情况。基于 Qt 的 XmlStreamRe…

12V 全桥驱动芯片GC9008——可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装芯片特点 ● H 桥电机驱…

使用 CompletableFuture 分批处理任务

一、无返回值任务函数 // 数据分批 List<List<StatisticsDTO>> batches Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures new ArrayList<>(batches.size());// 数据处理 for (int i 0; i < batches…

Pytorch 反向传播 计算图被修改的报错

先看看报错的内容 RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [5, 1]], which is output 0 of AsStridedBackward0, is at version 2; expected version 1 instead. Hint: enable an…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

4.6 BOUNDARY CHECKS

我们现在扩展了tile矩阵乘法内核&#xff0c;以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵&#xff0c;图4.18创建了矩阵的宽度为3&#xff0c;不是tile宽度&#xff08;2&#xff09;的倍数。图4.…

Spring事务控制

1.事务介绍 1.1什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执…