2011-12-29 11 views
0

我試圖將一個對象轉換爲字節數組&通過套接字發送給其他進程 ,但進程停止,而對象的反序列化只是掛起。 代碼有什麼問題?解除反序列化錯誤+套接字

客戶端代碼

namespace client_2 
{ 
    [Serializable] 
    class data 
    { 
     public ArrayList list; 
     public data() 
     { 
      list = new ArrayList(); 
     } 

     public void add(object o) 
     { 
      list.Add(o); 
     } 

     public void disp() 
     { 
      foreach (object ob in list) 
      { 
       Console.WriteLine(ob.ToString()); 
      } 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPAddress adr = IPAddress.Parse("127.0.0.1"); 
      TcpClient cli = new TcpClient(); 
      cli.Connect(adr, 5577); 
      NetworkStream strem = cli.GetStream(); 

      if (cli.Connected) 
      { 
       data d = new data(); 
       d.add("hello"); 
       d.add(44); 

       Byte[] buffer = new Byte[1024]; 

       BinaryFormatter from = new BinaryFormatter(); 
       MemoryStream ms = new MemoryStream(buffer,true); 

       from.Serialize(ms, d); 
       strem.Write(buffer, 0, buffer.Length); 
      } 
      strem.Close(); 
      cli.Close(); 
     } 
    } 
} 

服務器代碼

namespace server_2 
{ 
    [Serializable] 
    class data 
    { 
     public ArrayList list; 
     public data() 
     { 
      list = new ArrayList(); 
     } 

     public void add(object o) 
     { 
      list.Add(o); 
     } 

     public void disp() 
     { 
      foreach (object ob in list) 
      { 
       Console.WriteLine(ob.ToString()); 
      } 
     } 
    } 
    class Program 
    { 
     public static void handleReq(object o) 
     { 
      TcpClient client = o as TcpClient; 

      NetworkStream strm = client.GetStream(); 

      Byte[] buf = new Byte[1024]; 

      strm.Read(buf, 0, 1024); 

      BinaryFormatter from = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(buf, true); 

      data d = (data)from.Deserialize(ms); // hangs here 

      d.disp(); 

      strm.Close(); 
      client.Close(); 
     } 
     static void Main(string[] args) 
     { 
      IPAddress addr = IPAddress.Parse("127.0.0.1"); 

      TcpListener listner = new TcpListener(addr,5577); ; 
      listner.Start(); 

      while (true) 
      { 
       TcpClient client = listner.AcceptTcpClient(); 

       Task.Factory.StartNew(handleReq,client); 
      } 
      listner.Stop(); 
     } 
    } 
} 
+0

你需要閱讀整網絡流不僅僅是1024字節。您可以將網絡直接放入反序列化中。它會失敗無論如何,因爲在服務器端的類數據不匹配客戶端的類數據(使用共享的DLL爲客戶端和服務器,持有類數據) – rene 2011-12-29 10:56:57

+0

感謝您的回覆我正在嘗試你的建議 – vivek 2011-12-29 11:36:35

+0

它的工作感謝 – vivek 2011-12-30 09:10:04

回答

0

您需要閱讀整個的NetworkStream不只是1024字節。您可以將網絡流直接放入反序列化中。

它無論如何都會失敗,因爲在服務器端類data不會在客戶端類data匹配(使用共享DLL客戶端和服務器持有該類data