Socket数据的封包与解包,高手请进!在线等候中。。。急急急急急
本人现在有一个程序要求将一些数据库的字段名和值以一个数据包的方式发送出去。
注:数据有个.
那位大哥帮小弟出一个方案呀。
如果可行的话,马上给分。
问题点数:60、回复次数:15Top
1 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 21:51:51 得分 0
up.....
数据有多条。
各位大哥帮帮忙呀。Top
2 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 21:54:26 得分 0
up.....
不会吧???Top
3 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 22:01:34 得分 0
帮帮忙呀55555555.....Top
4 楼zyg158((DD)OTP)回复于 2004-12-02 22:07:22 得分 0
设计一个包头类型标识呵一个固定长度的数据长度信息,紧接着写数据.每个字段都这样写,另外最好也设计包的整体结构类型标识.
结构和XML差不多就行了
或者用XML格式Top
5 楼zyg158((DD)OTP)回复于 2004-12-02 22:11:42 得分 10
0x99 0x000A 0x11223344556677889900 0xXXXX
包头 长度 内容 校验信息
首先判断包头,然后读取长度,根据长度得到内容
另外还可以在内容后面加上固定长度的校验信息,
这样每次读完内容后还可以进行校验,提高内容的正确性Top
6 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 22:15:16 得分 0
to zyg158(DD)
谢谢了。非常感谢!你是说利用16进制的方式发送对不对?也就是byte啦?
请问有相关的代码参考吗?
如果有不胜感激!!
Thank you!Top
7 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 22:18:21 得分 0
up.....不要沉了!Top
8 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-02 22:22:31 得分 0
流着眼泪来提问55555......Top
9 楼xuan9932()回复于 2004-12-03 03:58:05 得分 0
当然是用字节传啊,你可以考虑一下写一个传输数据的类,其中包括长度和字节数组,然后把它串行化了传.Top
10 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-03 07:54:49 得分 0
to huan9932()
谢谢你的建议,小弟现在急需一个数据打包和封包的例子.
可否有例子给小弟看看呢?
小弟在此谢过了!
e_mail:xiao_huan1688@163.com 多谢!Top
11 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-03 08:02:13 得分 0
继续up......Top
12 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2004-12-03 10:40:52 得分 20
给你提个建议,使用NIO的ByteBuffer,Channel,直接用write(ByteBuffer[] srcs),就可以不用将报文自己来分割了,如:
public void testScatterGather() {
try {
String fileName = "D:\\eclipse3\\workspace\\NIOStudy\\file\\TestFileOutputStreamChannel";
File file=new File(fileName);
if(!file.exists()){
file.createNewFile();
}
assertEquals(true,file.exists());
FileOutputStream fileOs = new FileOutputStream(fileName);
FileChannel channel = fileOs.getChannel();
ByteBuffer bufferHead = ByteBuffer.allocate(4);
ByteBuffer bufferBody = ByteBuffer.allocate(4);
if (channel.isOpen()) {
bufferHead.put("head".getBytes());
bufferHead.flip();
bufferBody.put("body".getBytes());
bufferBody.flip();
channel.write(new ByteBuffer[] { bufferHead, bufferBody });
channel.close();
}
bufferHead.clear();
bufferBody.clear();
FileInputStream fileIn=new FileInputStream(file);
channel=fileIn.getChannel();
channel.read(new ByteBuffer[]{bufferHead,bufferBody});
bufferHead.flip();
bufferBody.flip();
byte[] datas=new byte[4];
bufferHead.get(datas,0,4);
assertEquals(true,(new String(datas)).equals("head"));
bufferBody.get(datas,0,4);
assertEquals(true,(new String(datas)).equals("body"));
channel.close();
} catch (Exception e) {
e.printStackTrace();
assertEquals(true,false);
}
但是不知道你的两端是不是全是Java,那么直接使用ObjectXXXStream算了,多简单,只是数据要大一点,但是设计好了,我想不会影响很大Top
13 楼xuan9932()回复于 2004-12-03 11:59:13 得分 30
//存放数据传输结构的类
class dataBlock implements Serializable
{
int size;
byte contents[];
public dataBlock(int size,byte contents[])
{
this.size =size;
this.contents=contents;
}
public void setsize(int size)
{
this.size=size;
}
public void setcontents(byte contents[])
{
this.contents =contents;
}
public int getsize()
{
return size;
}
public byte[] getcontents()
{
return contents;
}
}
然后
public Object readObject() throws Exception
{
int i = in.readInt();
byte a[] = new byte[i];
in.readFully(a);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(a));
return ois.readObject();
}
public void writeObject(Object ob)
throws Exception
{
ByteArrayOutputStream bais = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bais);
oos.writeObject(ob);
byte a[] = bais.toByteArray();
int length = a.length;
out.writeInt(length);
out.write(a);
out.flush();
}
最后一边发,一边接
发:
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fi));
int len=30000;
long total=length/30000;
int leftbytes=(int)(length-total*30000);
for(int i=0;i<total;i++)
{
byte a[] = new byte[len];
bis.read(a);
sendData(len,a);
}
byte a[]=new byte[leftbytes];
bis.read(a);
sendData(leftbytes,a);
if(readHeader()==9902)
uprtn=in.readUTF() ;
return uprtn;
}
接:
while (true) {
dataBlock fib = (dataBlock) readObject();
int len = fib.getsize();
byte a[] = fib.getcontents();
bos.write(a, 0, len);
if (len < 30000)
break;
}
sentData:
//发送数据包
public void sendData(int length,byte a[])
throws Exception
{
dataBlock fblk=new dataBlock(length,a);
writeObject(fblk);
}
别的消息头之类的自己写吧
Top
14 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-03 13:23:18 得分 0
to shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写)
非常感谢你!小弟在此多谢了!Top
15 楼LoveJ2ee_Frisk(小月又欠)回复于 2004-12-03 13:26:57 得分 0
to xuan9932() 非常感谢你贴这份代码给我。多谢啦!Top




