我现在想做一个TCP的通信的程序,当中通过建立socket连接来进行通信,通信的内容是我定义的一个对象,因为要将对象写道网络流当中,采用的是序列化的方式,但是有一个问题,在程序当中获得了网络流对象之后,如何将许多的对象一个个写道流中,在接收端又如何来实现一个个的全部反序列化呢,我好像每次只能序列化一个,多了就会出错,所以我采用的方法是每次通信都建立一个Socket连接,发送了一个对象之后就释放连接,使用起来也是可以的,只是感觉这个资源利用效率太低,有没有什么办法可以提高这个效率呢?

解决方案 »

  1.   

    我也十分关心这个问题,因为我用的是跟你一模一样的方法。
    再补充楼主一下:如果这个对象只接收了一半,是不可能反序列化的,应该怎么判断?在Socket中有什么办法让双方通信一定要对称,不采用流的方式?
    Remoting太难,MSDN上都没什么资料
      

  2.   

    Socket本来就是一个比较底层的协议,如果需要频繁通信,一般都要自己定义一个协议,连接的双方根据协议来进行收发。获取对象所占的字节数,每次发送的所有对象连在一起。
    如果发送不同对象则可以将每个对象的简短信息包括类型标识和所占字节数用固定长度存放在对象前,每个对象存一个,按顺序存,取的时候按顺序取就行了。总之,自己定义,符合自己的要求就好。
      

  3.   

    上面所用的办法可以解决你的问题,但不是一个很好的解决方案。我建议使用多次往返模型,即:在发送一个对象前先发送这个对象的信息,如我要发送MyObject类的一个实例,可以先发送"MyObject"给接收方,而接收方接收到之后就可以分别根据类型名用反射来得到类的信息,如Type.GetType("MyObject"),也可以事先约定好。
    接收方收到之后,确定知道发送方将要发送的东西后再给发送方发一个响应,如"OK"。
    发送方收到"OK"响应表示可发送真正的对象,便发送直接的对象或任何自定义消息。注:接收方一定要返回一个响应,发送方才可以继续发送,不然发送方发送的消息将是混乱的。而双方都通过"发送"->"接受"->"发送"……的模式进行,就不用像楼主说的断开连接了。
      

  4.   

    强烈建议Remoting技术,替代这个方案。
      

  5.   

    谢谢各位,我当时采用的方案是定义一个RawMessage对象其中包含两个属性,RawMessageType type; object data;data当中存储实际发送的对象,而用type来表示data实际的类型,每次发送一个对象都是将对象再次封装到RawMessage对象当中,接收端也是先反序列化之后判断其type再具体处理每一个对象,这样也行,只是感觉效率不太好
      

  6.   

    你这样做还是会出现异常的,我现在已经解决些问题,现在正在编码。
        解决方法是这样:加上一个integer型的包大小数组一并发送,接收端收到后要接到4+包大小数组(包实际上就是对象序列化后的二进制大小),再进行反序列化,多于这个数少于这个数都会出现异常,不信你自己试试
      

  7.   

    建立socket断掉就没用了啊,当然一直连的