中易网

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

答案:2  悬赏:0  
解决时间 2021-01-21 22:09
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 delimiterpublic DelimFramer(InputStream in){this.in=in;}@Overridepublic void frameMsg(byte[] message, OutputStream out) throws IOException {//ensure that the message dose not contain the delimiterfor(byte b:message){if(b==DELIMTER)throw new IOException("Message contains delimiter");}out.write(message);out.write(DELIMTER);out.flush();}@Overridepublic 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/Opublic LengthFramer(InputStream in) throws IOException{this.in=new DataInputStream(in);}@Overridepublic void frameMsg(byte[] message, OutputStream out) throws IOException {if(message.length>MAXMESSAGELENGTH){throw new IOException("message too long");}//write length prefixout.write((message.length>>BYTEMASK)&BYTEMASK);out.write(message.length&BYTEMASK);//write messageout.write(message);out.flush();}@Overridepublic 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 socket,这是封装好的tcp/ip API,然后用数据流,之间就可以相互传递字节数组了
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
众筹模式也不在不断创新中,大家看好众筹这个
跟着领导打天下的人为什么走不到最后
神武手游帮派贡献获取攻略
老公输精管结扎好几年后我怎么又怀孕了
儿童孤独症评定量表,筛查结果15分是什意思
结合汉江临眺和三居秋冥分析王维诗歌独特的诗
米店的经营方式
我宝宝出生17天怎么黄疸还没退
北京吸脂价格
CATIA学了之后,可以做什么工作
shiraz-merlot-eringa-idge这是什么红洒品牌
dnf90时光B套怎么样
如何免签停留香港
三个尾号的人民币10块值多少
番龙眼实木地板好吗?乐宜家地板的番龙眼实木
推荐资讯
OPPO r11市场价多少钱?
夏天树上吱吱叫的那个是什么虫子啊?
请帮忙翻译一下!
阳历2002年2月1日出生的孩子属相是什么
车知音汽车音响改装维修中心地址在什么地方,
千方科技股票属主板还是中小板
碧斯美容坊地址好找么,我有些事要过去
尿酸高不宜吃什么,因吃什么食物
买房四楼好还是六楼好
在三角形ABC中,a=4,b=2√2,面积为4,求角C跟
汗斑 需要忌口哪些食物??
岳飞 毕沅 饰名姝遗之 之是什么词 意思
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?