CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2EE / EJB / JMS

Socket数据的封包与解包,高手请进!在线等候中。。。急急急急急

楼主LoveJ2ee_Frisk(小月又欠)2004-12-02 21:48:21 在 Java / J2EE / EJB / JMS 提问

本人现在有一个程序要求将一些数据库的字段名和值以一个数据包的方式发送出去。  
  注:数据有个.    
  那位大哥帮小弟出一个方案呀。  
  如果可行的话,马上给分。 问题点数: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

相关问题

  • 求ISO8583封包解包程序
  • 在MIDAS中如何处理数据的封包和解包啊
  • rpm解包问题
  • tar解包出现问题
  • 如何打包和解包
  • 序列化解包问题
  • 如何在现有程序中使用socket (在线等候)
  • 一个很急很急的问题,关于socket,在线等候
  • 简单的socket问题 帮忙看看!在线等候,谢谢;
  • 100分,寻求rational rose2002的破解包?

关键词

  • 数据
  • channel
  • 内容
  • 信息
  • bufferbody
  • bufferhead
  • bytebuffer
  • 长度
  • 小弟
  • 校验

得分解答快速导航

  • 帖主:LoveJ2ee_Frisk
  • zyg158
  • shangqiao
  • xuan9932

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo