Java发送报文与接收报文的实例代码

报文(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();

到此这篇关于Java发送报文与接收报文的文章就介绍到这了,更多相关Java发送报文与接收报文内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java自定义协议报文封装 添加Crc32校验的实例

    刚做完的demo,直接进入主题了,开启两个线程,模拟Socket服务端和客户端通信,将数据封装为指定格式报文发送 代码: import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.Unkno

  • java中xml进行报文发送和解析操作

    利用OKhttp网络框架,进行Maven项目管理 //报文发送 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.0</version> </dependency> //报文解析 <dependency> <groupId>xom</gr

  • Java解析json报文实例解析

    这篇文章主要介绍了Java解析json报文实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 json报文如下: { "code": 0, "data": { "city": { "cityId": 284609, "counname": "中国", "name": "东城区", "

  • Android HTTP发送请求和接收响应的实例代码

    添加权限 首先要在manifest中加上访问网络的权限: 复制代码 代码如下: <manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest> 完整的Manifest文件如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>

  • Java发送报文与接收报文的实例代码

    报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块.报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变. 个人理解:从客户端把字符串写入字节数组流中传达至服务端,但是此字符串是XML格式的,然后到了服务端,使用字节数组进行获取该字符串,再获取该字符串的document对象(因为字符串是xml格式的),然后解析获取数据即可. 发送报文 先创建生成报文的方法,添加了xml数据 /** * @desc 生成xml报文且转换为字符串 * @return */

  • java 发送http和https请求的实例

    HTTP请求: 如果需要Json格式的自己转下,度娘上N种姿势- //处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或"POST" public static String httpRequest(String requestUrl,String requestMethod,String outputStr){ StringBuffer buffer=null; try{ URL url=new URL(requ

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • Java文件上传下载、邮件收发实例代码

    文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件

  • java多线程编程技术详解和实例代码

     java多线程编程技术详解和实例代码 1.   Java和他的API都可以使用并发. 可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序范围内的资源,比如共享内存,这种能力被称为多线程编程(multithreading),在核心的C和C++语言中并不具备这种能力,尽管他们影响了JAVA的设计. 2.   线程的生命周期 新线程的生命周期从"新生"状态开始.程序启动线程前,线程一直是"新生"状态:

  • java 实现计数排序和桶排序实例代码

    java 实现计数排序和桶排序实例代码 目录 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置. 在 冒泡排序 之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²).在 归并排序.快速排序 之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均 O(nlogn) . 比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布

  • java读取http请求中的body实例代码

    在http请求中,有Header和Body之分,读取header使用request.getHeader("..."); 读取Body使用request.getReader(),但getReader获取的是BufferedReader,需要把它转换成字符串, 下面是转换的方法. public static String getBodyString(BufferedReader br) { String inputLine; String str = ""; try {

  • java 数值类型分秒时间格式化的实例代码

    java 数值类型分秒时间格式化的实例代码 java 实例代码: import java.util.concurrent.TimeUnit; public class DateUtils { private static final String[] UNIT_DESC = new String[]{"天", "小时", "分钟", "秒"}; /** * 格式化持续时间<br/> * 将持续时间,格式化为 xx天

  • Java web含验证码及权限登录实例代码

    所用到的开发工具为myeclipse10,MySQL数据库. 首先,在myeclipse中新建一个Java web项目. 项目的结构: 数据库结构: 下面将各个包中的代码粘贴出来. com.ningmeng.dao包 package com.ningmeng.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLExcept

随机推荐