真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java通信協(xié)議解析代碼,java 協(xié)議解析

怎么按照自定義協(xié)議用java解析進(jìn)行遠(yuǎn)程通信

很簡單的, 首先使用io框架, netty, mina 都行。

創(chuàng)新互聯(lián)公司主營墨竹工卡網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,墨竹工卡h5小程序設(shè)計(jì)搭建,墨竹工卡網(wǎng)站營銷推廣歡迎墨竹工卡等地區(qū)企業(yè)咨詢

打開socket , 就可以收發(fā)數(shù)據(jù)了。

接來下選擇序列化框架,這取決于你的協(xié)議類型。文本協(xié)議? 字節(jié)協(xié)議?

文本協(xié)議: 比如 json? 那就用fast-json,jackson等來講對象序列化和反序列化。

字節(jié)協(xié)議:使用 magic-byte; java-struct之類的框架來進(jìn)行序列化和反序列化。

能傳輸, 能序列化/反序列化。 OKK 問題全部解決。 哈哈哈

TCP/IP協(xié)議 怎么用JAVA發(fā)送和接收二進(jìn)制數(shù)據(jù) 要具體實(shí)例

1.TCP/IP協(xié)議要求信息必須在塊(chunk)中發(fā)送和接收,而塊的長度必須是8位的倍數(shù),因此,我們可以認(rèn)為TCP/IP協(xié)議中傳輸?shù)男畔⑹亲止?jié)序列。如何發(fā)送和解析信息需要一定的應(yīng)用程序協(xié)議。

2.信息編碼:

首先是Java里對基本整型的處理,發(fā)送時,要注意:1)每種數(shù)據(jù)類型的字節(jié)個數(shù);2)這些字節(jié)的發(fā)送順序是怎樣的?(little-endian還是

big-endian);3)所傳輸?shù)臄?shù)值是有符號的(signed)還是無符號的(unsigned)。具體編碼時采用位操作(移位和屏蔽)就可以了。

具體在Java里,可以采用DataOutputStream類和ByteArrayOutputStream來實(shí)現(xiàn)?;謴?fù)時可以采用

DataInputStream類和ByteArrayInputStream類。

其次,字符串和文本,在一組符號與一組整數(shù)之間的映射稱為編碼字符集(coded character

set)。發(fā)送者與接收者必須在符號與整數(shù)的映射方式上達(dá)成共識,才能使用文本信息進(jìn)行通信,最簡單的方法就是定義一個標(biāo)準(zhǔn)字符集。具體編碼時采用

String的getBytes()方法。

最后,位操作。如果設(shè)置一個特定的設(shè)為1,先設(shè)置好掩碼(mask),之后用或操作;要清空特定一位,用與操作。

3.成幀與解析

成幀(framing)技術(shù)解決了接收端如何定位消息的首位位置的問題。

如果接收者試圖從套接字中讀取比消息本身更多的字節(jié),將可能發(fā)生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收

到的消息;如果發(fā)送者也在等待接收端的響應(yīng)消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將后面消息的一部分甚至

全部讀到第一條消息中去,這將產(chǎn)生一些協(xié)議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。

有兩個技術(shù):

1.基于定界符(Delimiter-based):消息的結(jié)束由一個唯一的標(biāo)記(unique

marker)指出,即發(fā)送者在傳輸完數(shù)據(jù)后顯式添加的一個特殊字節(jié)序列。這個特殊標(biāo)記不能在傳輸?shù)臄?shù)據(jù)中出現(xiàn)。幸運(yùn)的是,填充(stuffing)技術(shù)

能夠?qū)ο⒅谐霈F(xiàn)的定界符進(jìn)行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數(shù)據(jù),并在輸出消息中對其進(jìn)行還原,從而

使其與原始消息一致。

2.顯式長度(Explicit length):在變長字段或消息前附加一個固定大小的字段,用來指示該字段或消息中包含了多少字節(jié)。這種方法要確定消息長度的上限,以確定保存這個長度需要的字節(jié)數(shù)。

接口:

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 實(shí)現(xiàn)modbus-tcp協(xié)議的實(shí)現(xiàn)代碼,即用java 實(shí)現(xiàn)modbus-tcp協(xié)議,然后通過網(wǎng)絡(luò)通信,而非串口通信

按照TCP/ip協(xié)議 編程即可,使用某端口,直接連接設(shè)備的端口,建立TCP連接,其他的按照協(xié)議格式發(fā)送即可。

Android socket通信協(xié)議的封裝和解析

android socket通信協(xié)議的封裝和解析,其實(shí)是和java一樣的,都是通過http中的相關(guān)知識來封裝和解析,主要是通過多次握手,如下代碼:

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("服務(wù)器已啟動...");

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

//客戶端只要一連到服務(wù)器,便向客戶端發(fā)送下面的信息。

msg?=?"服務(wù)器地址:"?+this.socket.getInetAddress()?+?"come?toal:"

+mList.size()+"(服務(wù)器發(fā)送)";

this.sendmsg();

}?catch?(IOException?e)?{

e.printStackTrace();

}

}

@Override

public?void?run()?{

try?{

while(true)?{

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

//當(dāng)客戶端發(fā)送的信息為:exit時,關(guān)閉連接

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;

//接收客戶端發(fā)過來的信息msg,然后發(fā)送給客戶端。

}?else?{

msg?=?socket.getInetAddress()?+?":"?+?msg+"(服務(wù)器發(fā)送)";

this.sendmsg();

}

}

}

}?catch?(Exception?e)?{

e.printStackTrace();

}

}

/**

*?循環(huán)遍歷客戶端集合,給每個客戶端都發(fā)送信息。

*/

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

}

}

}

}????

}


分享標(biāo)題:java通信協(xié)議解析代碼,java 協(xié)議解析
文章來源:http://weahome.cn/article/dsisgdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部