Java通过Jpcap 操作网路数据链路层对报文数据解析、监听网络数据包(服务器+客户端)
众所周知,Java语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft windows 2000/XP等系统。
使用Jpcap能做的事:
1.Jpcap是直接抓取经过数据链路层的数据包。 因此可以自己写IP数据包直接发送给数据链路层。
2.Jpcap会对抓取到的数据包进行一定程序的解析,根据数据包内容,将数据包封装为对应的对象()。
3.根据用户设定的信息,过滤数据包(其实就是在解析的时候,对不需要的数据直接丢弃,不解析)
4.Jpcap 只是直接从数据链路层上读取数据,并向数据链路层中发送数据,因此,Jpcap并不能操作 其他程序从数据链路层中读数据或者向网卡中发送数据。(IP层协议程序)
二话不说首先我们先上项目结构
所需要的jar包我已打包好
0、客户端 InfraredSensorClient.java
[code]package com.airtimes.netty.network.client; import com.airtimes.netty.network.client.handler.InfraredSensorClientHandler; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; /** * * 服务器持续监听宿主机的网卡信息、并时时返回报警中心协议在网卡中交换的数据 * 客户端接收服务器端数据,打印出服务器送的消息 * */ public class InfraredSensorClient { public static void main(String[] args) throws Exception { // 创建EventLoopGroup线程池 Netty内部都是通过线程在处理数据 EventLoopGroup workerGroup = new NioEventLoopGroup(); try { // 创建客户端连接基类 用于连接服务器 Bootstrap bootstrap = new Bootstrap(); // (1) // 将 EventLoopGroup 加入线程池 bootstrap.group(workerGroup); // (2) // 使用changlefactory 创建通信频道 bootstrap.channel(NioSocketChannel.class); // (3) // Socket网路属性 bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // (4) // channel处理类 bootstrap.handler(new ChannelInitializer<SocketChannel>() { // 初始化channel @Override public void initChannel(SocketChannel channel) throws Exception { channel.pipeline().addLast(new InfraredSensorClientHandler()); } }); // Start the client. // 启动客户端 ChannelFuture f = bootstrap.connect("127.0.0.1", 9090).sync(); // (5) // Wait until the connection is closed. // 等待连接关闭 f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } }
1、客户端Handler InfraredSensorClientHandler .java
[code]package com.airtimes.netty.network.client.handler; import java.io.IOException; import com.airtimes.netty.network.response.Message; import com.airtimes.netty.network.tools.Util; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.ReferenceCountUtil; public class InfraredSensorClientHandler extends ChannelInboundHandlerAdapter { private static final Util util = new Util(); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { try { ByteBuf m = (ByteBuf)msg; String response = util.convertByteBufToString(m); System.out.println("收到来自服务器json信息: " + response + "\n"); ObjectMapper objectMapper = new ObjectMapper(); Message ClientMessage = objectMapper.readValue(response, Message.class); System.out.println("收到来自服务器对象信息: " + ClientMessage.toString() + "\n"); } catch (JsonParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JsonMappingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { ReferenceCountUtil.release(msg); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }
2、服务器端 InfraredSensorServer .java
[code]package com.airtimes.netty.network.server; import com.airtimes.netty.network.server.handler.InfraredSensorServerHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.timeout.ReadTimeoutHandler; import io.netty.handler.timeout.WriteTimeoutHandler; public class InfraredSensorServer { public static void main(String[] args) { // EventLoop 代替原来的 ChannelFactory EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new InfraredSensorServerHandler(), new WriteTimeoutHandler(10), // 控制写入超时10秒构造参数10表示如果持续10秒钟都没有数据写了,那么就超时。 new ReadTimeoutHandler(10) ); } }).option(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = serverBootstrap.bind(9090).sync(); f.channel().closeFuture().sync(); } catch (InterruptedException e) { } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } }
3、服务器端Handler InfraredSensorServerHandler .java
[code]package com.airtimes.netty.network.server.handler; import java.io.IOException; import java.util.Date; import java.util.UUID; import com.airtimes.netty.network.response.Message; import com.airtimes.netty.network.tools.TranscodingUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import jpcap.JpcapCaptor; import jpcap.NetworkInterface; import jpcap.packet.EthernetPacket; import jpcap.packet.IPPacket; import jpcap.packet.Packet; public class InfraredSensorServerHandler extends ChannelInboundHandlerAdapter { private static final int caplen = 65535; private static final boolean promiscCheck = true; private static int f = 0; private static int i = 0; // ChannelHandlerContext通道处理上下文 @Override public void channelActive(final ChannelHandlerContext ctx) throws InterruptedException, JsonProcessingException { // (1) // 第一步绑定网络设备 NetworkInterface[] devices = JpcapCaptor.getDeviceList(); for (NetworkInterface n : devices) { System.out.println("获取到本地网卡信息列表" + n.name + " | " + n.description); } System.out.println("-----------------------------------------------------------------"); JpcapCaptor jpcap = null; try { jpcap = JpcapCaptor.openDevice(devices[2], caplen, promiscCheck, 50); // 指定筛选条件 jpcap.setFilter("src 192.168.208.200 && len > 220 && len < 300 ", true); /* jpcap.setFilter("src 192.168.208.200 or 192.168.208.199 and len < 230 ",true); */ // 0 或 1 } catch (IOException e) { e.printStackTrace(); } // 第二步抓包 while (true) { Packet packet = jpcap.getPacket(); if (packet instanceof IPPacket && ((IPPacket)packet).version == 4) { i++ ; IPPacket ip = (IPPacket)packet;// 强转 System.out.println("-------------------------------------第" + i + "次抓取数据包参数信息--------------------------------------------"); System.out.println("版本:" + ip.version); System.out.println("优先权:" + ip.priority); System.out.println("区分服务:最大的吞吐量: " + ip.t_flag); System.out.println("区分服务:最高的可靠性:" + ip.r_flag); System.out.println("长度:" + ip.length); System.out.println("标识:" + ip.ident); System.out.println("DF:Don't Fragment: " + ip.dont_frag); System.out.println("NF:Nore Fragment: " + ip.more_frag); System.out.println("片偏移:" + ip.offset); System.out.println("生存时间:" + ip.hop_limit); String protocol = ""; switch (new Integer(ip.protocol)) { case 1: protocol = "ICMP"; break; case 2: protocol = "IGMP"; break; case 6: protocol = "TCP"; break; case 8: protocol = "EGP"; break; case 9: protocol = "IGP"; break; case 17: protocol = "UDP"; break; case 41: protocol = "IPv6"; break; case 89: protocol = "OSPF"; break; default: break; } System.out.println("协议:" + protocol); System.out.println("源IP " + ip.src_ip.getHostAddress()); System.out.println("目的IP " + ip.dst_ip.getHostAddress()); /* * System.out.println("源主机名: " + ip.src_ip); System.out.println("目的主机名: " + ip.dst_ip); */ TranscodingUtil transcodingUtil = new TranscodingUtil(); String hexString = transcodingUtil.toHexString(ip.data); String hexStringToString = transcodingUtil.hexStringToString(hexString); String hexStringHead = transcodingUtil.toHexString(ip.header); String StringHead = transcodingUtil.hexStringToString(hexStringHead); /********************** * 0-31 * ******************************************/ String substring0 = hexString.substring(0, 32); System.out.println("0-31频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring0)); System.out.println("0-31频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring0)); System.out.println("0-31频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring0)); System.out.println("0-31频段数据GB2312:" + transcodingUtil.hexStringToString(substring0)); System.out.println("0-31频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring0)); System.out.println("0-31频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring0)); System.out.println("0-31频段数据十进制 :" + transcodingUtil.transcoding(substring0)); System.out.println("0-31频段数据十六进制 :" + substring0); System.out.println("---------------------------------------------------------------------------------"); /********************** * 32-39 错误类型 * B7C0 C7F8 B8D0 D3A6 C6F7 B7C0 B2F0 BBD6 B8B4 防拆恢复 * ******************************************/ String substring = hexString.substring(32, 40); System.out.println("32-39频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring)); System.out.println("32-39频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring)); System.out.println("32-39频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring)); System.out.println("32-39频段数据GB2312:" + transcodingUtil.hexStringToString(substring)); System.out.println("32-39频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring)); System.out.println("32-39频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring)); System.out.println("32-39频段数据十进制 :" + transcodingUtil.transcoding(substring)); System.out.println("32-39频段数据十六进制 :" + substring); System.out.println("---------------------------------------------------------------------------------"); /********************** * 40-78 * B7C0 C7F8 B8D0 D3A6 C6F7 B7C0 B2F0 BBD6 B8B4 防拆恢复 * ******************************************/ String substring6 = hexString.substring(40, 78); System.out.println("40-78频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring6)); System.out.println("40-78频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring6)); System.out.println("40-78频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring6)); System.out.println("40-78频段数据GB2312:" + transcodingUtil.hexStringToString(substring6)); System.out.println("40-78频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring6)); System.out.println("40-78频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring6)); System.out.println("40-78频段数据十进制 :" + transcodingUtil.transcoding(substring6)); System.out.println("40-78频段数据十六进制 :" + substring6); System.out.println("---------------------------------------------------------------------------------"); /********************** * 79-103 * * ******************************************/ String substring4 = hexString.substring(79, 103); System.out.println("79-103频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring4)); System.out.println("79-103频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring4)); System.out.println("79-103频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring4)); System.out.println("79-103频段数据GB2312:" + transcodingUtil.hexStringToString(substring4)); System.out.println("79-103频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring4)); System.out.println("79-103频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring4)); System.out.println("79-103频段数据十进制 :" + transcodingUtil.transcoding(substring4)); System.out.println("79-103频段数据十六进制 :" + substring4); System.out.println("---------------------------------------------------------------------------------"); /********* 104-119 * ************************************************/ String substring2 = hexString.substring(104, 155); // 月份 String month = hexString.substring(108, 110); String transmonth = transcodingUtil.transcoding(month); // 日份 String day = hexString.substring(110, 112); String transday = transcodingUtil.transcoding(day); // 时间 String hour = hexString.substring(112, 114); String transhour = transcodingUtil.transcoding(hour); // 分钟 String min = hexString.substring(114, 116); String transmin = transcodingUtil.transcoding(min); // 秒 String sec = hexString.substring(116, 119); Integer transec = null; if (Integer.parseInt(transcodingUtil.transcoding(sec)) > 6) { transec = Integer.parseInt(transcodingUtil.transcoding(sec)) - 6; System.err.println("D" + transec); } else { transec = Integer.parseInt(transcodingUtil.transcoding(sec)); System.err.println("X" + transec); } System.out.println("104-119频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring2)); System.out.println("104-119频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring2)); System.out.println("104-119频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring2)); System.out.println("104-119频段数据GB2312:" + transcodingUtil.hexStringToString(substring2)); System.out.println("104-119频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring2)); System.out.println("104-119频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring2)); System.out.println("104-119频段数据拼接后时间序列:" + transmonth + "-" + transday + " " + transhour + ":" + transmin + ":" + transec); System.out.println("104-119频段数据十进制 :" + transcodingUtil.transcoding(substring2)); System.out.println("104-119频段数据—月份 :" + transmonth + "月"); System.out.println("104-119频段数据—日期 :" + transday + "日"); System.out.println("104-119频段数据—小时 :" + transhour + "时"); System.out.println("104-119频段数据—分钟 :" + transmin + "分钟"); System.out.println("104-119频段数据— 秒 :" + transec + "秒"); System.out.println("当前时间戳:" + System.currentTimeMillis()); System.out.println("104-119频段数据十六进制 :" + substring2); System.out.println("---------------------------------------------------------------------------------"); /********* 120-197 * ************************************************/ String substring5 = hexString.substring(120, 197); System.out.println("120-197频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring5)); System.out.println("120-197频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring5)); System.out.println("120-197频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring5)); System.out.println("120-197频段数据GB2312:" + transcodingUtil.hexStringToString(substring5)); System.out.println("120-197频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring5)); System.out.println("120-197频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring5)); System.out.println("120-197频段数据十进制 :" + transcodingUtil.transcoding(substring5)); System.out.println("120-197频段数据十六进制 :" + substring5); System.out.println("---------------------------------------------------------------------------------"); /********* 198-220 * ************************************************/ String substring3 = hexString.substring(198, 310); System.out.println("198-+频段数据UTF_8 :" + transcodingUtil.hexStringToStringUTF(substring3)); System.out.println("198-+频段数据GBK :" + transcodingUtil.hexStringToStringGBK(substring3)); System.out.println("198-+频段数据ISO :" + transcodingUtil.hexStringToStringISO(substring3)); System.out.println("198-+频段数据GB2312:" + transcodingUtil.hexStringToString(substring3)); System.out.println("198-+频段数据BIG5 :" + transcodingUtil.hexStringToStringBIG(substring3)); System.out.println("198-+频段数据UNICOD:" + transcodingUtil.hexStringToStringUNICODE(substring3)); System.out.println("198-+频段数据十进制 :" + transcodingUtil.transcoding(substring3)); System.out.println("198-+频段数据十六进制 :" + substring3); /********* 获取主机mac地址 *************************************************/ EthernetPacket datalink = (EthernetPacket)ip.datalink; StringBuffer srcMacStr = new StringBuffer(); int count = 1; for (byte b : datalink.src_mac) { String string = Integer.toHexString(b & 0xff); if (string.length() == 1) { string = "0" + string; } srcMacStr.append(string); if (count++ != datalink.src_mac.length) srcMacStr.append(":"); } System.out.println("获取主机mac地址为: " + srcMacStr); System.out.println("00:74:9c:e5:e0:01".equals(srcMacStr.toString())); /********* * 数据汇总 *************************************************/ String romateName ="3030315FB1A8BEAFD6F7BBFA"; String transRomateName = transcodingUtil.hexStringToStringGBK(romateName); System.out.println(transRomateName); System.out.println("*************************数据汇总***************************************"); System.out.println("数据包十六进制:" + hexString); System.out.println("数据包十六进制字符串数据包:" + hexStringToString); System.out.println("数据去向:" + ip.datalink); System.out.println("限制:" + ip.hop_limit); System.out.println("报文头十六进制:" + hexStringHead); System.out.println("报文头十进制:" + transcodingUtil.transcoding(hexStringHead)); System.out.println("报文头十六进制字符串:" + StringHead); System.out.println("ip对象包:" + ip); /* System.err.println("报文头中时间戳序列 :"+transcodingUtil.stampToDate(ip.sec)); */ /* System.out.println("ip对象包:"+ip.sec); */ System.out.println("系统时间:" + new Date()); f++ ; System.out.println("----------------------------本次抓取数据结束--累计" + f + "---------------------------------------------------"); System.out.println(); /********* * 将消息发送客户端汇总 *************************************************/ Message message = new Message(); message.setCurrentTime(new Date(System.currentTimeMillis()).toLocaleString()); message.setEventDescription(transcodingUtil.hexStringToStringGBK(substring6).trim()); message.setSystemCode(transcodingUtil.hexStringToStringGBK(substring)); message.setEventId(UUID.randomUUID().toString()); message.setSrcMac(srcMacStr.toString()); ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(message); /*String test = transcodingUtil.hexStringToString(substring);*/ ctx.writeAndFlush(Unpooled.wrappedBuffer(json.getBytes())); } } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }
4、消息实体 Message.java
[code]package com.airtimes.netty.network.response; public class Message { /** * 事件id */ private String eventId; /** * src_mac */ private String srcMac; /** * 系统码 */ private String systemCode; /** * 事件描述 */ private String eventDescription; /** * 子系統 */ private Integer masterArea; /** * 防区 */ private Integer slaverId; /** * 事件时间 */ private String currentTime; public String getEventId() { return eventId; } public void setEventId(String eventId) { this.eventId = eventId; } public String getSystemCode() { return systemCode; } public void setSystemCode(String systemCode) { this.systemCode = systemCode; } public String getEventDescription() { return eventDescription; } public void setEventDescription(String eventDescription) { this.eventDescription = eventDescription; } public Integer getMasterArea() { return masterArea; } public void setMasterArea(Integer masterArea) { this.masterArea = masterArea; } public Integer getSlaverId() { return slaverId; } public void setSlaverId(Integer slaverId) { this.slaverId = slaverId; } public String getCurrentTime() { return currentTime; } public void setCurrentTime(String currentTime) { this.currentTime = currentTime; } public String getSrcMac() { return srcMac; } public void setSrcMac(String srcMac) { this.srcMac = srcMac; } @Override public String toString() { return "Message [eventId=" + eventId + ", srcMac=" + srcMac + ", systemCode=" + systemCode + ", eventDescription=" + eventDescription + ", masterArea=" + masterArea + ", slaverId=" + slaverId + ", currentTime=" + currentTime + "]"; } }
5、工具类转换 TranscodingUtil .java
[code]package com.airtimes.netty.network.tools; import java.math.BigInteger; import java.text.SimpleDateFormat; import java.util.Date; public class TranscodingUtil { /** * 接收的byte包转换成16进制字符串 * * @param req * @return */ public static String toHexString(byte[] req) { // 进行编码转译 byte --> hexString (字母大写) String str = ""; for (int i = 0; i < req.length; i++ ) { String hex = Integer.toHexString(req[i] & 0xFF); if (hex.length() == 1) { hex = "0" + hex; } str += hex.toUpperCase(); } return str; } /** * 接收16进制字符串转换成10进制字符串 * * @param string * @return coding */ public static String transcoding(String string) { // 传过来字符串的16进制字符个数 int length = string.length() / 2; // 将字符串存进数组 String[] s = new String[length]; for (int i = 0; i < length; i++ ) { String ss = string.substring(i * 2, 2 + i * 2); s[i] = String.valueOf(ss); } // 定义接收转译之后的数组 String[] str = new String[s.length]; // 进行16进制向10进制转换 for (int j = 0, k = s.length; j < k; j++ ) { str[j] = new BigInteger(s[j], 16).toString(10); } // 将转移后的数组转换为字符串 StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length; i++ ) { sb.append(str[i]); } String coding = sb.toString(); return coding; } /** * 16进制字符串转换为字符串 * * @param s * @return */ public static String hexStringToString(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "GB2312"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String hexStringToStringUTF(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "utf-8"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String hexStringToStringGBK(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "gbk"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String hexStringToStringISO(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "GB18030"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String hexStringToStringBIG(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "big5"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String hexStringToStringUNICODE(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++ ) { try { baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "unicode"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } public static String[] bytesToHexStrings(byte[] src) { if (src == null || src.length <= 0) { return null; } String[] str = new String[src.length]; for (int i = 0; i < src.length; i++ ) { String hex = Integer.toHexString(src[i] & 0xFF); if (hex.length() == 1) { hex = "0" + hex; } hex.join(",", str); /* string.Join(",", s); */ } return str; } public static String toString(byte[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0;; i++ ) { b.append(a[i]); if (i == iMax) return b.append(']').toString(); b.append(", "); } } /* * 将时间戳转换为时间 */ public static String stampToDate(Long s) { String res; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long lt = new Long(s); Date date = new Date(lt); res = simpleDateFormat.format(date); return res; } public String convertByteBufToString(ByteBuf buf) { String str; if (buf.hasArray()) { // 处理堆缓冲区 str = new String(buf.array(), buf.arrayOffset() + buf.readerIndex(), buf.readableBytes()); } else { // 处理直接缓冲区以及复合缓冲区 byte[] bytes = new byte[buf.readableBytes()]; buf.getBytes(buf.readerIndex(), bytes); str = new String(bytes, 0, buf.readableBytes()); } return str; } public String Object2Json(Object obj) { JSONObject json = JSONObject.fromObject(obj);// 将java对象转换为json对象 String str = json.toString();// 将json对象转换为字符串 return str; } }
6、运行结果:服务器端启动后台效果
7、运行结果:客户端接收到服务器端报警信息
8、运行结果:服务器端启动后台效果
本文主要是对防区红外线设备、的报警信息通过报警主机之间通信截获报警数据、数据类型、防区报警、以及报警级别数据、进行捕捉解析转发、使用Netty Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序、当有客户端请求连接时、客户端将会收到服务器广播的异常信息、文中主要是以Json字符串类型、
本文出自 “想学Python的Java程序猿” 博客,请务必保留此出处郑重声明转载请注明原地址、谢谢https://blog.csdn.net/qq_37606336/article/details/85045785
- Java Json解析,Java Web Json解析,Java Web服务端获取Json数据,客户端通过HTTP获取Json数据
- java SDK ,上传、读取 基本类型数据通过服务器(客户端代码)
- java实现服务端守护进程来监听客户端通过上传json文件写数据到hbase中
- 通过JPcap捕获网络TCP数据包,并将解析的信息写入execl文件中
- 【转载】Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据,作者:Jaiky_杰哥
- Android-通过网络获取xml文件使用pull解析得到服务器中的信息(新闻客户端)
- Java数据接口编写简单例子,Java Json解析,服务端接口输出Json数据,客户端通过HTTP获取接口Json数据
- Java Json解析,Java Web Json解析,Java Web服务端获取Json数据,客户端通过HTTP获取Json数据
- 如何通过Java的Web服务器把DataSet或DataTable数据通过json格式传回给C#的客户端
- 客户端与服务器通过gson解析json数据
- android客户端+JAVA WEB服务器实现json数据解析
- java 监听器(监听用户监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可 以自动激发一些操作,比如监听在线的用户的数量。当增加一在线人数)
- Java读取网络数据(新浪网址)InputStream的数据流操作实录笔记(二) 分享出来供大家参考!(
- 如何在客户端通过MSSQL执行某操作删除服务器的指定文件
- java服务器向flex客户端一对一推送数据
- Java客户端通过HttpURLConnection连接Web服务器的Session保存问题
- 【script代码段】通过<script src="http://xxx.com/index.php"></script>中的src属性将服务器断数据传到客户端
- Java客户端通过Http发送POST请求上传文件到web服务器
- Java读取网络数据(新浪网址)InputStream的数据流操作实录笔记(一) 分享出来供大家参考!
- 收藏——Java导出数据到excel保存在服务器及客户端下载