关于socket 分包和组包

2014-11-24 10:38:44 · 作者: · 浏览: 0

直接贴代码。

建议使用字节流。

消息形式为 包长度(short)+包头(short)+messages(string)+包尾(short)

组包

[java]
private void writesMessage(short cmd , String messages, short move,Socket socket) {
initOutput();
try {
output.writeShort(cmd);
output.writeChars(messages);
output.writeShort(move);
MyUtil.sendMessage(socket, byteOutput.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
}

private void initOutput()
{
byteOutput = new ByteArrayOutputStream();
output = new DataOutputStream(byteOutput);
}

/**
* 发送数据到网络流
*
* @param socket
* @param bytes
* @throws Exception
*/
public static void sendMessage(Socket socket, byte[] bytes)throws Exception {
DataOutputStream dataOutput = new DataOutputStream(socket.getOutputStream());
// 编写数据的长度
dataOutput.writeShort(bytes.length);
dataOutput.write(bytes);
dataOutput.flush();
}


拆包

[java]
short len = br.readShort();//br 为DataInputStream
short cmd = br.readShort();
byte[] bytes = new byte[len];
br.read(bytes, 0, len-4);
String messgeString = new String(bytes);
System.out.println("首条消息:"+messgeString);
short move = br.readShort();