如何组织和解析固定结构的消息包?

birditren2001 2003-10-24 02:35:20
字段名 字节数 类型 描述
Length 4 无符号整数 消息总长度
Id 8 无符号整数 采用两个32位(4字节)的整数:
(1)时间:(格式为MMDDHHMMSS,即月日时分秒):转换为整数填写到该字段中前四个字节中
(2)序列号(四字节整数):写到该字段中后四个字节中。(序列号,从1开始顺序累加,步长为1,循环使用)
Msg_Length 1 无符号整数 信息长度(<=140个字节)
Msg_Content Msg_Length 定长字符串,左对齐存储,空余位置补’\0’。 信息内容

###比如,这样一个消息包结构,我该怎么组织消息,怎么解析消息包?
就是说我在发消息的时候我该怎么建立一个消息包?收到消息的时候又该如何解析这样的消息包呢?初学,呵呵。
...全文
47 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_zp 2003-10-27
  • 打赏
  • 举报
回复
这样的要求,一般都是对方通信程序是c写的。要求结构体,java不支持结构体。
结构体本质是内存的一段buffer。
可以用jdk1.4里面得nio包的bytebuffer来构造这个结构体。把接受到的数据放到buffer里面,用getint()之类的方法取出来,不过你要注意java是不支持无符号变量的。你接受到数据必须转化一下才行。还有字符串,必须转成本地的中文编码。
在c语言里面使用结构体是很方便的。我现在正在考虑是不是可以构建一个Hashmap,因为他的使用方法和结构体很像。然后用装饰器转换成bytebuffer。这样封装后使用就很方便了。请大家看看课不可行。
javafish 2003-10-27
  • 打赏
  • 举报
回复
我觉得2楼说的方法好。
你在收到消息是解析包,在发送是组合包,这样使用方便些。
解析包可以这样处理
inputLine=inputLine.trim();
int length=Integer.parseInt(inputLine.substring(0,3));
int id=Integer.parseInt(inputLine.substring(4,8));
int msg_Length=Integer.parseInt(inputLine.substring(12,1));
String msgContent=inputLine.substring(13,msg_Length);


birditren2001 2003-10-27
  • 打赏
  • 举报
回复
有人跟我说可以这样接收:
totalLen = 4 + 8 + 1 + Msg_length;
byte[] msgStru = new byte[totalLen];
Length = (msgStru[0] << 24) + (msgStru[1] << 16) + (msgStr[2] << 8) + msgStru[3];
IdTime = (msgStru[4] << 24) + (msgStru[5] << 16) + (msgStr[6] << 8) + msgStru[7];
IdSerail = (msgStru[8] << 24) + (msgStru[9] << 16) + (msgStr[10] << 8) + msgStru[11];
Msg_length = msgStru[12];
Msg_Content = new String(msgStru, 13, Msg_Length);
可我还是不知道如何写到我的程序中,在我的程序中,String line = in.readLine();这行是我读入数据的地方,请哪位帮我修改成读入以上结构的消息包的程序,
birditren2001 2003-10-27
  • 打赏
  • 举报
回复
应该是serversocket,错误修改。
birditren2001 2003-10-27
  • 打赏
  • 举报
回复
下面的程序是我写的的一个从客户端读入输入流的一个例子程序,是serverclient程序中的一个Service,我测试过字符串,可以正常打印,现在如果收到上面提到的结构的输入,我该怎么接收?就是说我收到的是一个消息结构,我该如何接收?我是初学,希望在我的程序上帮我修改一下。
public static class ParseSms implements Service {
public void serve(InputStream i, OutputStream o) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(i));
PrintWriter out =
new PrintWriter(new BufferedWriter(new OutputStreamWriter(o)));
String line = in.readLine();
System.out.println(line);

out.close();
in.close();
}
}
etre 2003-10-27
  • 打赏
  • 举报
回复
你要做什么什么样的啊,Socket并不是那么难啊。
用Sokcet+XMl真得是不错的选择啊。
birditren2001 2003-10-26
  • 打赏
  • 举报
回复
因为是合作,所以不是说什么方式比较好就会采用什么方式的,现在对方给我一个数据包协议,也就是我上面提到的数据包格式,然后让我按照这个协议接收数据,我告诉对方端口号和IP地址,所以我没有选择,只能按照这个协议来接收数据,请哪位做过socket程序的老大讲解一下,谢谢,分数不够可以再加。
etre 2003-10-26
  • 打赏
  • 举报
回复
封装成XML格式的数据包比较好!!
wxh512 2003-10-26
  • 打赏
  • 举报
回复
up
fanfyj 2003-10-26
  • 打赏
  • 举报
回复
up
birditren2001 2003-10-26
  • 打赏
  • 举报
回复
继续顶。。。
birditren2001 2003-10-26
  • 打赏
  • 举报
回复
顶一下。
birditren2001 2003-10-25
  • 打赏
  • 举报
回复
再顶一下。
captivate 2003-10-25
  • 打赏
  • 举报
回复
帮你UP一下,我也想知道。
birditren2001 2003-10-24
  • 打赏
  • 举报
回复
还有就是,根据这样的协议,我该如何发消息包给对方?
import java.net.*;
import java.io.*;
public class EchoClient {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.out.println("用法:EchoClient <主机名> <端口号>");
return;
}
Socket socket = new Socket(args[0],
Integer.parseInt(args[1]));
PrintWriter out = new PrintWriter(
socket.getOutputStream(), true); // true指定自动刷新流
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream())); // 支持Unicode字符
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
//String userInput;
out.println("abcdefg") ;//我现在是简单的发字符串过去,我不知道按照他的协议我该发送什么给对方?
System.out.println("返回:" + in.readLine());
out.close(); in.close();
stdIn.close(); socket.close();
}
}
birditren2001 2003-10-24
  • 打赏
  • 举报
回复
就是说我从客户端发送字符串过来可以正常显示,但是另外一个人给我的消息包协议是上面我提到的数据格式,举个例子:
字段名 字节数 类型 描述
Length 4 无符号整数 消息总长度
Msg_Length 1 无符号整数 信息长度(<=140个字节)
Msg_Content Msg_Length 定长字符串,左对齐存储,空余位置补’\0’。 信息内容
就以上这样的数据格式,我上面的程序该如何接收?哪位帮我在上面的程序改一下?让我理解怎么处理这样的数据包,谢谢。
birditren2001 2003-10-24
  • 打赏
  • 举报
回复
下面的程序是我写的的一个从客户端读入输入流的一个例子程序,是serverclient程序中的一个Service,我测试过字符串,可以正常打印,现在如果收到上面提到的结构的输入,我该怎么接收?
public static class ParseSms implements Service {
public void serve(InputStream i, OutputStream o) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(i));
PrintWriter out =
new PrintWriter(new BufferedWriter(new OutputStreamWriter(o)));
String line = in.readLine();
System.out.println(line);

out.close();
in.close();
}
}
honkyjiang 2003-10-24
  • 打赏
  • 举报
回复
用socket接受 不过你知道了封装的对象类型就是了 DataInputStream有相应的
read方法 再转化为对应的数据就是啦
vcvj 2003-10-24
  • 打赏
  • 举报
回复
用javax.net
里的new类
ChannelSocket之类的,搞定
birditren2001 2003-10-24
  • 打赏
  • 举报
回复
我println出来的信息中涉及到字符串的都正常显示,就是无符号整数我也用字符串来现实出现乱码,我现在想知道的时候我如何从收到的信息中按字节截取相应为然后付给对应的数据类型,然后再println出来呢?
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧