日期:2014-05-20  浏览次数:20832 次

java中socket编程自定义tcp数据包结构等
整个包的定义包括
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;