通过TCP建立客户端和服务器之间的连接
并且数据通信按照既定的协议进行传递
客户端发送数据是一帧一帧的断断续续的发送
如规定协议中规定每个数据帧的标志位为连续的4个0x00
如何通过InputStream读取服务器接收到来自客户端的数据
并将每个数据帧放入一个数组中?
并且数据通信按照既定的协议进行传递
客户端发送数据是一帧一帧的断断续续的发送
如规定协议中规定每个数据帧的标志位为连续的4个0x00
如何通过InputStream读取服务器接收到来自客户端的数据
并将每个数据帧放入一个数组中?
InputStream中找4个0x00 和4个0x00之间的内容放入到数组中。如果只有一个4个0x00 就全部放进去
主要是协议解析的部分,把代码贴出来共享下...
暂时协议还没有进一步讨论,目前协议以连续四个结束标志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();
}
}
希望继续深入的讨论这个通信问题
UDP通信直接发送,接收时有信息接收
没有信息的时候就一直阻塞
TCP通信过程中,InputStream和OutputStream一直存在
而且通信过程中信息一般是断续的
如何更好的区分一个个的数据信息?
上面是以结束标志来判断,也可以通过加数据长度位
其他的还有更好的方法吗?...欢迎建议
4个0x00,普通数据中存在这种数据的太多太多了如果你是要做TCP分包的话...不是这么做的...
一个TCP包应该被分为包头,包体
包头采用固定长度字节序,并且,每个字节序根据双方协议来定义
一般在包头中会指明,包体长度根据包体长度来接收包体数据,即可保持一个包的完整性
采用标志位的方法,只能适用于某些特定的数据,没有通用性
因为你无法保证正常数据中不会包含标志位信息
就是用0xFF也是不可以的,异常情况下很有可能出现的就是这种情况
因此现在建议该成连续的四个数字了,比如出现连续的0x56,0x57,0x58,0x58
这样可以很好的判断数据帧的结束吧~
协议方面的东西,的确还是要看看的
包头采用固定长度字节序,并且,每个字节序根据双方协议来定义
一般在包头中会指明,包体长度