JAVA利用TCP进行数据通信

BatiTan 2008-07-02 05:51:31
通过TCP建立客户端和服务器之间的连接
并且数据通信按照既定的协议进行传递
客户端发送数据是一帧一帧的断断续续的发送
如规定协议中规定每个数据帧的标志位为连续的4个0x00
如何通过InputStream读取服务器接收到来自客户端的数据
并将每个数据帧放入一个数组中?
...全文
335 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
一个TCP包应该被分为包头,包体
包头采用固定长度字节序,并且,每个字节序根据双方协议来定义
一般在包头中会指明,包体长度
beiouwolf 2008-07-07
  • 打赏
  • 举报
回复
为什么要这么做??
4个0x00,普通数据中存在这种数据的太多太多了

如果你是要做TCP分包的话...不是这么做的...
一个TCP包应该被分为包头,包体
包头采用固定长度字节序,并且,每个字节序根据双方协议来定义
一般在包头中会指明,包体长度

根据包体长度来接收包体数据,即可保持一个包的完整性


采用标志位的方法,只能适用于某些特定的数据,没有通用性
因为你无法保证正常数据中不会包含标志位信息
loveyunwt 2008-07-07
  • 打赏
  • 举报
回复
最好楼主研究一下其它现成的协议方面的东西
BatiTan 2008-07-07
  • 打赏
  • 举报
回复
现在结束标志如果用连续的0X00的确是有问题的
就是用0xFF也是不可以的,异常情况下很有可能出现的就是这种情况
因此现在建议该成连续的四个数字了,比如出现连续的0x56,0x57,0x58,0x58
这样可以很好的判断数据帧的结束吧~
协议方面的东西,的确还是要看看的
都市巴巴 2008-07-07
  • 打赏
  • 举报
回复
最好楼主研究一下其它现成的协议方面的东西
BatiTan 2008-07-03
  • 打赏
  • 举报
回复
为了更好的利用可用分
希望继续深入的讨论这个通信问题
UDP通信直接发送,接收时有信息接收
没有信息的时候就一直阻塞
TCP通信过程中,InputStream和OutputStream一直存在
而且通信过程中信息一般是断续的
如何更好的区分一个个的数据信息?
上面是以结束标志来判断,也可以通过加数据长度位
其他的还有更好的方法吗?...欢迎建议
BatiTan 2008-07-03
  • 打赏
  • 举报
回复
呵呵,马甲现在可能脱下来了
忘记穿了吧...
havelock 2008-07-03
  • 打赏
  • 举报
回复
也,马甲居然没出现?
havelock 2008-07-03
  • 打赏
  • 举报
回复
问题解决了~~结帖吧,慢了一个小时~~
night__cat 2008-07-03
  • 打赏
  • 举报
回复
恭喜楼主
BatiTan 2008-07-03
  • 打赏
  • 举报
回复
终于搞定了~
主要是协议解析的部分,把代码贴出来共享下...
暂时协议还没有进一步讨论,目前协议以连续四个结束标志0xFF结束

public void run(){
int value= 0;
int length= 0;
int flagSum= 0;
try{
ByteBuffer byteBuffer= ByteBuffer.allocate(1024);
while((value= inStream.read())!= -1){
if(length== 0){
System.out.println(new Date()+ " "+ socket.getInetAddress()+ " "+ socket.getPort());
}
System.out.print(value+ " ");
byteBuffer.put((byte)value);
length++;
if(value== 255){
flagSum++; //遇到标志位,则将标志位个数加1
}else{
flagSum= 0;
}

if(flagSum== 4){
System.out.println("Length= "+ length);

byteBuffer.flip(); //结束当前缓冲区添加操作

byte[] data= new byte[byteBuffer.limit()];
byteBuffer.get(data);

byteBuffer.clear();

System.out.println("协议解析后的信息如下:");
MessageFrame msg= new MessageFrame(data);

System.out.println("head CommandType: "+ msg.getCommandType());
System.out.println("head DeviceType: "+ msg.getDeviceType());
System.out.println("head ObjectType: "+ msg.getObjectType());
System.out.println("head ObjectId: "+ msg.getObjectId());


Iterator<Object> listIterator= msg.listValues().listIterator();
while(listIterator.hasNext()){
Object o= listIterator.next();
System.out.println(o.getClass()+ ": "+ o);
}
System.out.println();

flagSum= 0; //标志位重新开始计数
length= 0; //帧数据长度置0
}
}
}catch(IOException e){
e.printStackTrace();
}

}
sagezk 2008-07-02
  • 打赏
  • 举报
回复
一般是通过在每帧的头部记录此帧数据的长度来使接收方判断一帧数据何时结束,否则一旦帧数据中有连续的4个0x00,那么收帧方会错误的划分帧数据的。
reality 2008-07-02
  • 打赏
  • 举报
回复
如规定协议中规定每个数据帧的标志位为连续的4个0x00 我觉得这样不合适。。。。
InputStream中找4个0x00 和4个0x00之间的内容放入到数组中。如果只有一个4个0x00 就全部放进去

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧