日期:2014-05-20 浏览次数:20832 次
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;