转自:https://blog.csdn.net/jadyer/article/details/8788303

package com.jadyer.util;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;/*** 使用JavaSocket编写发送TCP请求的工具类* @see 类似的有一个Mina工具类:http://blog.csdn.net/jadyer/article/details/8088068* @see 欲查询Scoket的有关属性:http://blog.csdn.net/jadyer/article/details/8788272* @create Apr 5, 2013 9:25:34 PM* @author 玄玉<http://blog.csdn.net/jadyer>*/
public class TCPUtil {private TCPUtil(){}/*** 发送TCP请求* @see 本方法默认的连接超时和读取超时均为30秒* @see 编码与解码请求响应字节时,均采用双方约定的字符集,即本方法的第四个参数reqCharset* @param IP         远程主机地址* @param port       远程主机端口* @param reqData    待发送报文的中文字符串形式* @param reqCharset 该方法与远程主机间通信报文的编码字符集(编码为byte[]发送到Server)* @return localPort--本地绑定的端口,reqData--请求报文,respData--响应报文,respDataHex--远程主机响应的原始字节的十六进制表示*/public static Map<String, String> sendTCPRequest(String IP, String port, String reqData, String reqCharset){Map<String, String> respMap = new HashMap<String, String>();OutputStream out = null;      //写InputStream in = null;        //读String localPort = null;      //本地绑定的端口(java socket, client, /127.0.0.1:50804 => /127.0.0.1:9901)String respData = null;       //响应报文String respDataHex = null;    //远程主机响应的原始字节的十六进制表示Socket socket = new Socket(); //客户机try {socket.setTcpNoDelay(true);socket.setReuseAddress(true);socket.setSoTimeout(30000);socket.setSoLinger(true, 5);socket.setSendBufferSize(1024);socket.setReceiveBufferSize(1024);socket.setKeepAlive(true);socket.connect(new InetSocketAddress(IP, Integer.parseInt(port)), 30000);localPort = String.valueOf(socket.getLocalPort());/*** 发送TCP请求*/out = socket.getOutputStream();out.write(reqData.getBytes(reqCharset));/*** 接收TCP响应*/in = socket.getInputStream();ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();byte[] buffer = new byte[512];int len = -1;while((len=in.read(buffer)) != -1){bytesOut.write(buffer, 0, len);}/*** 解码TCP响应的完整报文*/respData = bytesOut.toString(reqCharset);respDataHex = formatToHexStringWithASCII(bytesOut.toByteArray());} catch (Exception e) {System.out.println("与[" + IP + ":" + port + "]通信遇到异常,堆栈信息如下");e.printStackTrace();} finally {if (null!=socket && socket.isConnected() && !socket.isClosed()) {try {socket.close();} catch (IOException e) {System.out.println("关闭客户机Socket时发生异常,堆栈信息如下");e.printStackTrace();}}}respMap.put("localPort", localPort);respMap.put("reqData", reqData);respMap.put("respData", respData);respMap.put("respDataHex", respDataHex);return respMap;}/*** 通过ASCII码将十进制的字节数组格式化为十六进制字符串* @see 该方法会将字节数组中的所有字节均格式化为字符串* @see 使用说明详见<code>formatToHexStringWithASCII(byte[], int, int)</code>方法*/private static String formatToHexStringWithASCII(byte[] data){return formatToHexStringWithASCII(data, 0, data.length);}/*** 通过ASCII码将十进制的字节数组格式化为十六进制字符串* @see 该方法常用于字符串的十六进制打印,打印时左侧为十六进制数值,右侧为对应的字符串原文* @see 在构造右侧的字符串原文时,该方法内部使用的是平台的默认字符集,来解码byte[]数组* @see 该方法在将字节转为十六进制时,默认使用的是<code>java.util.Locale.getDefault()</code>* @see 详见String.format(String, Object...)方法和new String(byte[], int, int)构造方法* @param data   十进制的字节数组* @param offset 数组下标,标记从数组的第几个字节开始格式化输出* @param length 格式长度,其不得大于数组长度,否则抛出java.lang.ArrayIndexOutOfBoundsException* @return 格式化后的十六进制字符串*/private static String formatToHexStringWithASCII(byte[] data, int offset, int length){int end = offset + length;StringBuilder sb = new StringBuilder();StringBuilder sb2 = new StringBuilder();sb.append("\r\n------------------------------------------------------------------------");boolean chineseCutFlag = false;for(int i=offset; i<end; i+=16){sb.append(String.format("\r\n%04X: ", i-offset)); //X或x表示将结果格式化为十六进制整数sb2.setLength(0);for(int j=i; j<i+16; j++){if(j < end){byte b = data[j];if(b >= 0){ //ENG ASCIIsb.append(String.format("%02X ", b));if(b<32 || b>126){ //不可见字符sb2.append(" ");}else{sb2.append((char)b);}}else{ //CHA ASCIIif(j == i+15){ //汉字前半个字节sb.append(String.format("%02X ", data[j]));chineseCutFlag = true;String s = new String(data, j, 2);sb2.append(s);}else if(j == i&&chineseCutFlag){ //后半个字节sb.append(String.format("%02X ", data[j]));chineseCutFlag = false;String s = new String(data, j, 1);sb2.append(s);}else{sb.append(String.format("%02X %02X ", data[j], data[j + 1]));String s = new String(data, j, 2);sb2.append(s);j++;}}}else{sb.append("   ");}}sb.append("| ");sb.append(sb2.toString());}sb.append("\r\n------------------------------------------------------------------------");return sb.toString();}
}

JavaSocket编写发送TCP请求的工具类相关推荐

  1. 分享一个发送http请求的工具类

    分享一个发送http请求的工具类 maven依赖只需要导入一个 <dependencies><dependency><groupId>commons-httpcli ...

  2. 发送http请求的工具类

    大家工作中都会遇到使用http请求调用合作商接口的需求,下面分享一个封装好的http请求工具类 1.发送GET请求 /***发送GET方法的请求*/public static String sendG ...

  3. 超好用的后端发送http请求HttpUtils工具类(基于原生http连接,不需要另外导包)

    在项目中,为了实现一些特定的功能,我们常常需要发送http异步请求 ,为此需要特意封装一个实用的HttpUtils工具类 HttpUtils工具类内容如下: package com.zyw.secki ...

  4. Objective-c 异步发送Post请求的工具类

    原文链接iOS开发--post异步网络请求封装 有改动 HttpUtil.h #import <Foundation/Foundation.h> #import <UIKit/UIK ...

  5. 前端请求接口post_程序员:HttpClient进行post请求的工具类,访问第三方接口HTTPS...

    HTTPS (英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure) 是一 ...

  6. java常用的发送http请求的工具方法

    java常用的HttpURLConnection 方式发送http请求的工具方法 需要的jar包有jsp-api.jar .servlet-api.jar .dom4j.jar package cn. ...

  7. jmeter测试TCP服务器/模拟发送TCP请求

    jmeter测试TCP服务器,使用TCP采样器模拟发送TCP请求. TCP采样器:打开一个到指定服务器的TCP / IP连接,然后发送指定文本并等待响应. jmeter模拟发送TCP请求的方法: 1. ...

  8. 【短信发送】实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现

    实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现 一.开通腾讯云短信服务 二.工具类--使用qcloudsms实现短信发送 三.Spring Boot项目引入短信发送功能 我们发 ...

  9. Http请求-hutool工具类的使用

    Http请求-hutool工具类的使用 前言 在日常java后端开发的工作中经常会遇到后端发起HTTP请求的情况,这里可以使用一个简单的工具类. 官方网址:Http请求-HttpRequest (hu ...

最新文章

  1. UTF-8 CPP的使用
  2. java面向对象基础复习
  3. SpringBoot报错Unsatisfied dependency expressed through field userMapper和Whitelabel Error Page解决方案
  4. php函数表达式,正规表达式函数_php
  5. java逆数组如何print_Java 逆数组
  6. php 下拉菜单 多个值,PHP,而foreach下拉菜单在所有下拉菜单中都具有相同的选定值...
  7. 面向大数据的异构内存系统
  8. 职场七种最致命的想法
  9. 腕上“小型手机”!小米手表万事俱备 坐等发布
  10. 关于QQ的几点改进建议
  11. 【初赛】「程序填空」题答v1.0
  12. wtl单文档选项_WTL_简介与体系
  13. Spring实战第五章idea复现
  14. 自定义等高的cell(storyboard)
  15. Google GWT
  16. 共享栈的简单实现(C语言)
  17. 阿里云Kuberneters微服务部署案例
  18. 数据结构与算法之时间复杂度与空间复杂度
  19. matlab som如何使用,使用SOM对数据进行聚类
  20. 《富爸爸 穷爸爸》读书笔记

热门文章

  1. 深入剖析Android音频之AudioTrack
  2. ULN2803A达林顿管与集电极开路输出元件使用笔记
  3. pycharm可以运行,打包报错 ModuleNotFoundError: No module named ‘frontend‘
  4. APIO2013 道路费用
  5. 访问中国气象 php,各种天气预报API 新浪 + 中国天气网
  6. 踏浪点神:9.12恒指早盘分析及最新资讯
  7. Matlab:基本绘图函数
  8. srilm的安装与使用(标贝科技)
  9. 2021年中国建筑行业发展概况:建筑业总产值持续增长,未来发展方向明确[图]
  10. 输出一个目录下的目录树