整个包的定义包括
head 2byte
length
crc16 校验
flag
content 内容
end
我对网络编程这块没接触过,希望大家指点下资料或者代码看看,有人讲解下java里发送和接受数据包的一些关键点,非常感谢
有资料最好
------解决方案--------------------------------------------------------
北京圣思园教育,张龙主讲的那个视频,对这儿有讲解,讲得挺基础的,你可以下下来,看一下
------解决方案--------------------------------------------------------
《TCP.IP协议详解》讲解的很详细
------解决方案--------------------------------------------------------
我这有段代码用于接收字节流。楼主可以参考一下
- Java code
public byte[] readXmlBytesFromSocket(Socket socket) throws IOException, ReadXmlBytesException{ InputStream bis = socket.getInputStream(); byte[] lengthBytes = new byte[4]; if (bis.read(lengthBytes, 0, 4) == 4) { int length = Util.bytesToint(lengthBytes); int rest = length; byte[] messageBytes = new byte[length]; int read = 0; while (rest > 0) { byte[] buffer = new byte[rest]; read = bis.read(buffer); if(read > length || rest < 0){ throw new ReadXmlBytesException("读取xml字节流溢出"); } else { System.arraycopy(buffer, 0, messageBytes, length - rest, read); rest -= read; } } return messageBytes; } else { throw new ReadXmlBytesException("获取数据长度失败"); } }
------解决方案--------------------------------------------------------
这东西可不是一句两句能说清楚的,你定义的结构基本上也够了。
header 里最好加上消息序号,用于判断收到的消息是哪条消息的响应,以及表示请求消息,还是响应消息的标识。
消息序号可以使用 UUID(需要 16 个字节),或者其他自行设计的不会重复的标识。
------解决方案--------------------------------------------------------
/** Source port number */
public int src_port;
/** Destination port number */
public int dst_port;
/** Sequence number */
public long sequence;
/** ACK number */
public long ack_num;
/** URG flag */
public boolean urg;
/** ACK flag */
public boolean ack;
/** PSH flag */
public boolean psh;
/** RST flag */
public boolean rst;
/** SYN flag */
public boolean syn;
/** FIN flag */
public boolean fin;