精华内容
下载资源
问答
  • Java发送报文与接收报文

    千次阅读 多人点赞 2021-01-25 15:02:31
    发送报文,接收报文,解析报文,返回报文

    报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

    个人理解:从客户端把字符串写入字节数组流中传达至服务端,但是此字符串是XML格式的,然后到了服务端,使用字节数组进行获取该字符串,再获取该字符串的document对象(因为字符串是xml格式的),然后解析获取数据即可。

    发送报文

    先创建生成报文的方法,添加了xml数据

    /**
    	 * @desc 生成xml报文且转换为字符串
    	 * @return
    	 */
    	public String xmlToString() {
    		StringBuffer sendStr = new StringBuffer();
    		// 以下为添加的xml信息
    		sendStr.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    
    		sendStr.append("<request_data>");
    		sendStr.append("<request_token>BCDBCD</request_token>");
    		sendStr.append("<request_cardNum>62284801912705</request_cardNum>");
    		sendStr.append("<request_name>张飞</request_name>");
    		sendStr.append("<request_pass>123123</request_pass>");
    		sendStr.append("<request_time>"+new Dates().CurrentYMDHSMTime()+"</request_time>");
    
    
    		sendStr.append("<monery_count>200.00</monery_count>");
    		sendStr.append("<shop_name>吉野家</shop_name>");
    		sendStr.append("<shop_id>JYJ</shop_id>");
    		sendStr.append("<sale_no>"+UUID.randomUUID().toString()+"</sale_no>");
    		sendStr.append("</request_data>");
    		// 创建字符串用于返回
    		String str = sendStr.toString();
    		return str;
    	}
    

    将报文xml转为流写入

    /**
    	 * @desc 将xml转为流写入
    	 * @param servletConnection
    	 * @throws IOException 
    	 */
    	public void xmlWriteStream(HttpURLConnection servletConnection) throws IOException {
    		// 创建流,写入xml数据
    		OutputStream ouput = servletConnection.getOutputStream();
    		// 调用方法获取xml字符串
    		String str = xmlToString();
    		System.out.println(str);
    		// 将xml字符串转为btye数组写入流
    		ouput.write(str.getBytes("UTF-8"));
    		ouput.flush();// 刷新流
    		ouput.close();// 关闭流
    	}
    

    创建客户端与服务端的连接并且设置发送报文的一些属性

    /**
    	 * @desc 创建客户端与服务端的连接并且设置发送报文的一些属性
    	 * @return
    	 * @throws IOException 
    	 */
    	public HttpURLConnection cerateServletUrl() throws IOException {
    		// 服务端地址
    		URL uploadServlet = new URL("http://localhost:1023/BaoWenServer/xmlServlet.do");
    		// 创建连接
    		HttpURLConnection servletConnection = (HttpURLConnection) uploadServlet.openConnection();
    		// 设置连接参数
    		servletConnection.setRequestMethod("POST"); // 请求类型为post
    		servletConnection.setDoOutput(true); // 是否可读
    		servletConnection.setDoInput(true); // 是否可写
    		servletConnection.setAllowUserInteraction(true); // 是否可交互
    		return servletConnection;
    	}
    

    获取服务端反馈回来的结果

    /**
    	 * @desc 获取服务端反馈回来的结果
    	 * @param servletConnection
    	 * @throws IOException
    	 */
    	public void getResponseResult(HttpURLConnection servletConnection)
    			throws IOException {
    	
    		System.out.println("===============**服务端的返回值**==================");
    		// 获取返回的数据
    		InputStream inputStream = servletConnection.getInputStream();//获取反馈回来的流
    		//创建一个缓冲读取的reader对象
    		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    		//创建一个能够承接返回来值得sb
    		StringBuffer sb = new StringBuffer();
            //创建一个能够临时存储读取一行信息的变量
    		String strMessage = "";
    		//开始循环读取返回的流信息
    		while ((strMessage = reader.readLine()) != null) {
    			sb.append(strMessage);//将返回的流的信息逐行的压如到sb中
    		}
    
    		System.out.println("接收返回值:" + sb);
    	}
    

    最后的调用方法

    /**
    	 * @throws IOException 
    	 * @desc 用于调用方法发送报文的方法
    	 */
    	public void sendMessage() throws IOException {
    		try {
    			System.out.println("=================开始发送报文=================");
    			// 建立连接
    			HttpURLConnection servletConnection = cerateServletUrl();
    			// 写入数据
    			xmlWriteStream(servletConnection);
    			// 获取返回数据
    			getResponseResult(servletConnection);
    		} catch (java.net.ConnectException e) {
    			System.out.println("客户端与服务端连接异常,请再次尝试");
    		}
    	}
    

    接收报文

    服务端使用web项目进行构建
    在service中设置编码集

    		request.setCharacterEncoding("utf-8");
    		response.setCharacterEncoding("utf-8");
    

    获取客户端发送过来的报文

    //----------------通过request.getInputStream()获取输入的流----------------------
    	// 指定每次8kb
    	final int BUFFER_SIZE = 8 * 1024;
    	byte[] buffer = new byte[BUFFER_SIZE];
    	// 获取输出流,与客户端的输出流相对应
    	ServletInputStream sis = request.getInputStream();
    //	System.out.println("sis:"+sis);
    			
    	int length = 0;
    	// 创建字节输出流
    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
    	do {
    		length = sis.read(buffer);
    		if (length > 0) {
    			// 写入至字节输出流
    			baos.write(buffer, 0, length);
    		}
    	} while (length * 2 == BUFFER_SIZE);
    	// 把字节输出流转为字符串,得到客户端发送的数据,即为报文
    	String bodyData = new String(baos.toByteArray());
    

    此时bodyData就是客户端发送来的报文数据:

    <?xml version="1.0" encoding="utf-8"?>
    <request_data>
    	<request_token>BCDBCD</request_token>
    	<request_cardNum>62284801912705</request_cardNum>
    	<request_name>张飞</request_name>
    	<request_pass>123123</request_pass>
    	<request_time>2021年01月25日 14:51:52</request_time>
    	<monery_count>200.00</monery_count>
    	<shop_name>吉野家</shop_name>
    	<shop_id>JYJ</shop_id>
    	<sale_no>fc4c66dc-b54b-4052-89c1-902be7569f18</sale_no>
    </request_data>
    

    读该xml可分析数据:张飞在2021年01月25日 14:51:52在商家id为JYJ的吉野家消费了200.00元,本次消费的流水单号为fc4c66dc-b54b-4052-89c1-902be7569f18,使用的卡号为62284801912705,该卡密码为123123(未采用加密),且当前的标识码为BCDBCD

    解析报文

    客户端发送的报文数据为Xml类型,所以直接用Xml的数据解析方法解析即可

    	// 获取报文之后,开始解析报文,即为解析Xml
    	//1.初始化jdk中的用来解析xml的dom工厂
    	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    	//2:获得具体的dom解析器
    	DocumentBuilder db = dbf.newDocumentBuilder();
    	//3: 解析一个xml文档,获得Document对象(根结点)
    	InputSource is = new InputSource(new StringReader(bodyData));
    		
    	Document document = null;
    	try{
    		document = db.parse(is);//将流转换成document对象
    	}catch(Exception e){			
    		return ;
    	}
    

    获取完document对象之后,开始解析

    	//通过抓取根节点进而获取子节点
    	NodeList list = document.getElementsByTagName("request_data");
    	Map<String, Object> map = new HashMap<String, Object>();//将抓取之后获得到的值存在map中
    	XmlServiceImpl service = new XmlServiceImpl();
    	for (int i = 0; i < list.getLength(); i++) {
    		Element element = (Element) list.item(i);//通过item(i)获取根节点下的每一个子节点
    		//1.识别码
    		String request_token = element.getElementsByTagName("request_token").item(0).getFirstChild().getNodeValue();
    		map.put("request_token", request_token);
    
    		//2.卡号
    		String request_cardNum = element.getElementsByTagName("request_cardNum").item(0).getFirstChild().getNodeValue();
    		map.put("request_cardNum", request_cardNum);
    
    		//3.持卡人姓名
    		String request_name = element.getElementsByTagName("request_name").item(0).getFirstChild().getNodeValue();
    		map.put("request_name", request_name);
    
    		//4.该卡的密码
    		String request_pass = element.getElementsByTagName("request_pass").item(0).getFirstChild().getNodeValue();
    		map.put("request_pass", request_pass);
    
    		//5.本次消费请求的时间
    		String request_time = element.getElementsByTagName("request_time").item(0).getFirstChild().getNodeValue();
    		map.put("request_time", request_time);
    				
    		//6.本次消费的金额
    		String monery_count = element.getElementsByTagName("monery_count").item(0).getFirstChild().getNodeValue();
    		map.put("monery_count", monery_count);
    				
    		  
    		//7.本次消费到的商家的名字
    		String shop_name = element.getElementsByTagName("shop_name").item(0).getFirstChild().getNodeValue();
    		map.put("shop_name", shop_name);
    									
    				
    		//8.本次消费到的商家的id
    		String shop_id = element.getElementsByTagName("shop_id").item(0).getFirstChild().getNodeValue();
    		map.put("shop_id", shop_id);
    								
    		//9.本次消费到的流水单号
    		String sale_no = element.getElementsByTagName("sale_no").item(0).getFirstChild().getNodeValue();
    		map.put("sale_no", sale_no);		  			   	
    	}
    

    此时输出map对象,查看数据

    {request_name=张飞, shop_id=JYJ, request_time=2021年01月25日 14:51:52, request_token=BCDBCD, monery_count=200.00, sale_no=fc4c66dc-b54b-4052-89c1-902be7569f18, request_cardNum=62284801912705, shop_name=吉野家, request_pass=123123}
    

    返回报文

    一切无误后,返回报文

    	// 要返回的报文
    	StringBuffer resultBuffer = new StringBuffer();
    	resultBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    	resultBuffer.append("<request_data>");
    	resultBuffer.append("<request_name>"+request_name+"</request_name>");
    	resultBuffer.append("<request_cardNum>"+request_cardNum+"</request_cardNum>");
    	resultBuffer.append("<request_time>"+new Dates().CurrentYMDHSMTime()+"</request_time>");
    	resultBuffer.append("<shop_name>"+shop_name+"</shop_name>");
    	resultBuffer.append("<sale_no>"+sale_no+"</sale_no>");
    	resultBuffer.append("<request_token>成功了</request_token>");
    	resultBuffer.append("</request_data>");
    	 // 设置发送报文的格式
    	response.setContentType("text/xml");
    	response.setCharacterEncoding("UTF-8");
    						  
    	PrintWriter out = response.getWriter();
    	out.println(resultBuffer.toString()); 
    	out.flush();
    	out.close();
    

    学习交流q群:470464545,大家一起学习进步,CSDN博客:lolly1023

    展开全文
  • 先是发送报文请求和返回报文的公共方法。(这里也是网上查询到的,只是没找到原文的地址,望谅解) 1.请求报文和返回报文的公共方法 我这里是设置了三个参数因为有编码格式的要求所以设置了编码入参 public static ...

    应公司需求,要求开发一个用java代码完成每天对报文的解析,来方便监控每天的跑批结果。

    废话不多说。

    先是发送报文请求和返回报文的公共方法。(这里也是网上查询到的,只是没找到原文的地址,望谅解)

    1.请求报文和返回报文的公共方法
    我这里是设置了三个参数因为有编码格式的要求所以设置了编码入参

    public static String sendPost(String xmlInfo,String url,String chartset) {
    
    String line ="";
    
    StringBuffer resultSting =new StringBuffer();
    
    try {
    
    URL uri =new URL(url);
    
    URLConnection con = uri.openConnection();
    
     con.setDoOutput(true);
    
    con.setDoInput(true);
    
    con.setUseCaches(false);
    
    con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    
    con.setRequestProperty("accept","*/*");
    
    con.setRequestProperty("connection","Keep-Alive");
    
    con.setRequestProperty("Accept-Charset","UTF-8");
    
    con.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
    
    OutputStreamWriter out =new OutputStreamWriter(
    
    con.getOutputStream());
    
    System.out.println("---地址为urlStr=" + uri);
    
    System.out.println("---请求报文xmlInfo=" + xmlInfo);
    
    out.write(new String(xmlInfo.getBytes(chartset)));
    
    out.flush();
    
    out.close();
    
      BufferedReader br =new BufferedReader(new InputStreamReader(con.getInputStream()));
    
       for (line = br.readLine(); line !=null; line = br.readLine()) {
    
         System.out.println("---返回报文:---" + line);
    
         resultSting.append(line);
    
    }
    
    return resultSting.toString();
    
    }catch (MalformedURLException e) {
    
    e.printStackTrace();
    
    }catch (IOException e) {
    
    e.printStackTrace();
    
    }
    
    return resultSting.toString();
    
    }
    
    

    2.获取返回报文中的节点信息

    public class getMessage(){
    
    private static Stringxml ="<?xml version=\"1.0\" encoding=\"GBK\"?><PACKET type=\"REQUEST\" version=\"1.0\">" +"请求报文的内容"+"</PACKET>";
    
    
    
    public String getErrorMessage(){
    
    String xmlBack = Common.sendPost(xml, url,"UTF-8");//调用方法发送报文获取返回报文
    
    Document document = DocumentHelper.parseText(xmlBack);//获取Document对象
    
    Element BODY=root.element("BODY");//获取子结点,然后一级一级的获取到你需要的节点
    
    Element MESSAGE=BODY.element("MESSAGE");
    
    String mes = MESSAGE.getTextTrim();
    
    return mes;
    
    }
    
    }
    

    这就是这个例子的简单执行。如果你要获取的是一个list集合型的报文的话。那么

    List nodes = document.selectNodes("/PACKET/BODY/MESSAGE_LIST/MESSAGE");//获取到重复子节点集合

    这样就可以获取到MESSAGE_LIST标签下的MESSAGE的集合。本来想用对象去接收,但因为是复杂的xml类型,需求的数据也不止MESSAGE中的内容所以就选择了根据节点获取。

    记录每一个新的发现。如有错误请告知,不胜感谢。

    —菜白的java搬运工
    我的简书:https://www.jianshu.com/p/334837fe3308

    展开全文
  • 【JAVA】Socket通讯发送报文

    千次阅读 2020-04-08 14:56:58
    Socket通讯发送报文: 报文头为byte数组格式的报文长度 int length = message.getBytes().length; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Socket socket = new Socket("192.168.168....

    报文头为byte数组格式的报文长度

    方法外设置静态变量,如下:

    public static int readSize = 1024*4;
    

    通讯方法,如下:

    int length = message.getBytes().length;
    String backMsg = "";
    
    try {
    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
    	Socket socket = new Socket("192.168.168.168", 2500); //IP端口
    	OutputStream os = socket.getOutputStream();
    	BufferedOutputStream bos = new BufferedOutputStream(os);
    	baos.write(int2bytes(length)); //报文长度转成byte数组
    	baos.write(message.getBytes());
    	baos.close();
    	bos.write(baos.toByteArray());
    	bos.flush();
    	
    	//接收响应报文
    	InputStream is = socket.getInputStream();
    	BufferedInputStream bis = new BufferedInputStream(is);
    	baos = new ByteArrayOutputStream();
    	
    	//缓冲输入流循环读取一段就写入字节数组输出流
    	byte[] buf = new byte[readSize];
    	int i = bis.read(buf); //缓冲输入流读取数据存入buf字节数组
    	int total = bytes2int(buf); //报文总长,读取报文头前四个字节
    	int got = 0;
    	while(i != -1){
    		if(i < readSize){
    			byte[] lastByte = new byte[i];
    			baos.write(lastByter);
    		} else{
    			baos.write(buf);//buf字节数组写入字节数组输出流
    		}
    		got += i;
    		if(got >= total){
    			break;
    		}
    		i = bis.read(buf);
    	}
    	byte[] received = baos.toByteArray();
    	backMsg = new String(received);
    
    	baos.close();
    	bis.close();
    	bos.close();
    	socket.close();
    } catch(UnknowHostException e){
    	e.printStackTrace();
    } catch(IOException e){
    	e.printStackTrace();
    } finally{
    }
    
    return backMsg;
    

    int转byte数组方法,如下:

    public static byte[] int2bytes(int num){
    	byte[] b = new byte[4];
    	for (int i = 0; i < 4; i++){
    		b[i] = (byte)(num >>> (24 - i*8));
    	}
    	return b;
    }
    

    解析:int类型占4个字节,因此使用4个字节的byte数组。
    (byte)强转只能转最低的8位,因此需要把高位右移成最低的8位强转再存入byte数组。

    右移24位:
    ________ ________ ________ 01111111 11111111 11111111 11111111
      					    	 b[0] 
    右移16位:
    ________ ________ 01111111 11111111 11111111 11111111
                   			     b[1]
    右移8位:
    ________ 01111111 11111111 11111111 11111111
                   			     b[2]
    右移0位:
    01111111 11111111 11111111 11111111
                   			     b[3]
    

    byte数组转int方法,如下:

    public static int bytes2int(byte[] b){
    	int mask = 0xff;
    	int temp = 0;
    	int res = 0;
    	for(int i = 0; i < 4; i++){
    		res <<= 8;
    		temp = b[i] & mask; //按位与运算,取最低8位,忽略负数
    		res |= temp; //按位或运算
    	}
    	return res;
    }
    
    展开全文
  • Postman连续发送报文&动态参数postman发送的请求是连续发送的,并不是并发请求建立http请求设置动态参数批量发送请求 postman发送的请求是连续发送的,并不是并发请求 建立http请求 1.创建http请求,设置header...

    postman发送的请求是连续发送的,并不是并发请求

    建立http请求

    1.创建http请求,设置header参数和请求参数,选择参数类型
    在这里插入图片描述

    设置动态参数

    1.设置全局参数,或是环境参数,定义好字段名称和值,在postman使用格式为“{{字段名}}”
    在这里插入图片描述
    2.一个字段设置多个值,可以直接通过txt文件,先进行编辑,然后在runner里边,进行文件加载,在编辑txt时,第一行为字段名,使用逗号隔开
    在这里插入图片描述

    批量发送请求

    在runner中选择发送请求之后,设置发送请求测试即可。
    在这里插入图片描述

    展开全文
  • 上一篇文章介绍了如何构造报文,现在简单讲一下发送报文的步骤 1、获取接口列表 点击主界面工具栏中的“刷新列表”按钮(或对应菜单“interface->Reference interfaces”) 所有接口会列在左侧窗口中; 2...
  • telnet发送报文

    2020-11-30 15:49:52
    Windows7,cmd窗口 一、开启telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。 开始-控制面板-程序和功能-...charset=UTF-8 Content-Length: 81 {json请求报文} 5.退出cmd:exit
  • # -*- coding: utf-8 -*- ...# http发送报文 def httpsend(url, bw): req = urllib2.Request(url, bw) res_data = urllib2.urlopen(req) res = res_data.read() print(res) # 打出响应信息 i...
  • DPDK学习记录4 - rte_eth_tx_burst如何发送报文 1 gdb调试发送函数 1.1 1.2 1.3 2 发送示意图
  • TCP 报文的请求报文长度和响应报文长度: node1:/root#tcpdump -S -i eth1 '((tcp) and (port 8080) and (host 192.168.137.2) )' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode ...
  • 项目中涉及到报文发送发送报文是xml格式的,返回的报文也是xml格式的,但是是unicode编码,如下图 会把 &lt; 和 &gt; 符号解析成编码形式,但是我们想要的是这种xml格式的 使用decodeURL方法...
  • snmp协议发送报文

    千次阅读 2018-04-08 15:34:30
    完成功能 采用轮训的方式完成报文发送 public void sendAllPDU() throws IOException { Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); snmp.listen(); TransportMapping transport = new ...
  • 使用PostMan发送报文

    千次阅读 2017-11-06 17:18:16
    目的:为了让代码走这个方法的断点 Postman中的发送请求路径要和web,xml中配置对应,如下: 我这里需要两次发送Postman 一次查询操作 一次确认操作 上图是查询 上图是查询对应的postman怎么填写 ...最终的返回报文
  • 为了构造特定payload的tcp报文,算是费了一些功夫。 第一次尝试: 修改接口MTU。发现然而并没什么用。...发现有效果,通过抓包发现payload的确变成20了,但是发送报文的速率又降低了, 所以采用了多线程+
  • DHCP_SendPacket 发送报文

    千次阅读 2012-02-13 14:34:37
    函 数 名 : DHCP_Send... 功能描述 : 发送报文  输入参数 :  (输入的参数类型统一为小写,对应的参数值区分大小写)  -sendtype 发送的端口,可以输入: uni / nni / cni / uni2 / nni2 / cni2
  • mina框架中logger接收与发送报文被省略的解决办法
  • // 调用webserver接口发送报文,通过xfire第三方调用  Object[] result1 = null;  Client client = null;  try {  client = new Client(new URL(eciInfSetup.getUrl()));  result1
  • PE框架发送报文,适用于PE及VX技术 步骤: 1.在action中使用发送报文,要指定报文在router端的交易名称 2.如果使用supe.execute(context)来发送,不需要第一步 3.配置从网银到router的xml报文 4.根据...
  • TCP在没有采用pacing rate的方式(即将要发送报文以一定的速率慢慢地发送发送速率时,可能会出现一次性发送大量数据的情况(burstiness)。 那么在什么情况下TCP发送端会一次性发送大量数据呢?这里有两种情况...
  • 1.request→raw 2.新建groovy,右击→get data,选择 add,运行groovy就知道发送出去的报文是什么了
  • 使用TCP协议发送报文

    千次阅读 2019-01-11 18:05:03
     /// 发送数据  /// &lt;/summary&gt;  /// &lt;param name="xml"&gt;&lt;/param&gt;  private bool SendMessage(string xml,out string msg)  {  ...
  • 在使用HttpClient请求数据的时候,请求参数的封装有两种方式:UrlEncodedFormEntity...如:使用UrlEncodedFormEntity()发送请求格式为:{"age":"14","name":"lili","...
  • 使用netty发送报文的坑

    万次阅读 2018-01-08 15:51:13
    最近跟银行调试一个接口的时候,行方说明是TCP/IP socket同步短链接的方式,开始采用socket和niosocket都不行,最后采用了了netty形式发送,代码很简单就是创建一个ChannelHandlerAdapter.主要代码如下, 测试类: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,096
精华内容 9,638
关键字:

发送报文