成都创新互联网站制作重庆分公司

java通信协议解析代码,java 协议解析

怎么按照自定义协议用java解析进行远程通信

很简单的, 首先使用io框架, netty, mina 都行。

创新互联公司主营墨竹工卡网站建设的网络公司,主营网站建设方案,app开发定制,墨竹工卡h5小程序设计搭建,墨竹工卡网站营销推广欢迎墨竹工卡等地区企业咨询

打开socket , 就可以收发数据了。

接来下选择序列化框架,这取决于你的协议类型。文本协议? 字节协议?

文本协议: 比如 json? 那就用fast-json,jackson等来讲对象序列化和反序列化。

字节协议:使用 magic-byte; java-struct之类的框架来进行序列化和反序列化。

能传输, 能序列化/反序列化。 OKK 问题全部解决。 哈哈哈

TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例

1.TCP/IP协议要求信息必须在块(chunk)中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。如何发送和解析信息需要一定的应用程序协议。

2.信息编码:

首先是Java里对基本整型的处理,发送时,要注意:1)每种数据类型的字节个数;2)这些字节的发送顺序是怎样的?(little-endian还是

big-endian);3)所传输的数值是有符号的(signed)还是无符号的(unsigned)。具体编码时采用位操作(移位和屏蔽)就可以了。

具体在Java里,可以采用DataOutputStream类和ByteArrayOutputStream来实现。恢复时可以采用

DataInputStream类和ByteArrayInputStream类。

其次,字符串和文本,在一组符号与一组整数之间的映射称为编码字符集(coded character

set)。发送者与接收者必须在符号与整数的映射方式上达成共识,才能使用文本信息进行通信,最简单的方法就是定义一个标准字符集。具体编码时采用

String的getBytes()方法。

最后,位操作。如果设置一个特定的设为1,先设置好掩码(mask),之后用或操作;要清空特定一位,用与操作。

3.成帧与解析

成帧(framing)技术解决了接收端如何定位消息的首位位置的问题。

如果接收者试图从套接字中读取比消息本身更多的字节,将可能发生以下两种情况之一:如果信道中没有其他消息,接收者将阻塞等待,同时无法处理接收

到的消息;如果发送者也在等待接收端的响应消息,则会形成死锁(dealock);另一方面,如果信道中还有其他消息,则接收者会将后面消息的一部分甚至

全部读到第一条消息中去,这将产生一些协议错误。因此,在使用TCP套接字时,成帧就是一个非常重要的考虑因素。

有两个技术:

1.基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique

marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。幸运的是,填充(stuffing)技术

能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符。在接收者扫描定界符时,还能识别出修改过的数据,并在输出消息中对其进行还原,从而

使其与原始消息一致。

2.显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。这种方法要确定消息长度的上限,以确定保存这个长度需要的字节数。

接口:

Java代码 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }

定界符的方式:

Java代码 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }

显式长度方法:

Java代码 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.lengthMAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.lengthBYTEMASK)BYTEMASK); out.write(message.lengthBYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0=length=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }

java 实现modbus-tcp协议的实现代码,即用java 实现modbus-tcp协议,然后通过网络通信,而非串口通信

按照TCP/ip协议 编程即可,使用某端口,直接连接设备的端口,建立TCP连接,其他的按照协议格式发送即可。

Android socket通信协议的封装和解析

android socket通信协议的封装和解析,其实是和java一样的,都是通过http中的相关知识来封装和解析,主要是通过多次握手,如下代码:

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Main {

private static final int PORT = 9999;

private ListSocket mList = new ArrayListSocket();

private ServerSocket server = null;

private ExecutorService mExecutorService = null; //thread pool

public static void main(String[] args) {

new Main();

}

public Main() {

try {

server = new ServerSocket(PORT);

mExecutorService = Executors.newCachedThreadPool();  //create a thread pool

System.out.println("服务器已启动...");

Socket client = null;

while(true) {

client = server.accept();

//把客户端放入客户端集合中

mList.add(client);

mExecutorService.execute(new Service(client)); //start a new thread to handle the connection

}

}catch (Exception e) {

e.printStackTrace();

}

}

class Service implements Runnable {

private Socket socket;

private BufferedReader in = null;

private String msg = "";

public Service(Socket socket) {

this.socket = socket;

try {

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//客户端只要一连到服务器,便向客户端发送下面的信息。

msg = "服务器地址:" +this.socket.getInetAddress() + "come toal:"

+mList.size()+"(服务器发送)";

this.sendmsg();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void run() {

try {

while(true) {

if((msg = in.readLine())!= null) {

//当客户端发送的信息为:exit时,关闭连接

if(msg.equals("exit")) {

System.out.println("ssssssss");

mList.remove(socket);

in.close();

msg = "user:" + socket.getInetAddress()

+ "exit total:" + mList.size();

socket.close();

this.sendmsg();

break;

//接收客户端发过来的信息msg,然后发送给客户端。

} else {

msg = socket.getInetAddress() + ":" + msg+"(服务器发送)";

this.sendmsg();

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 循环遍历客户端集合,给每个客户端都发送信息。

*/

public void sendmsg() {

System.out.println(msg);

int num =mList.size();

for (int index = 0; index  num; index ++) {

Socket mSocket = mList.get(index);

PrintWriter pout = null;

try {

pout = new PrintWriter(new BufferedWriter(

new OutputStreamWriter(mSocket.getOutputStream())),true);

pout.println(msg);

}catch (IOException e) {

e.printStackTrace();

}

}

}

}    

}


网站标题:java通信协议解析代码,java 协议解析
本文来源:http://cxhlcq.com/article/dsisgdd.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部