2011-12-29 1 views
0

オブジェクトをバイト配列&に変換しようとしましたが、ソケットを介して他のプロセス に送信しましたが、オブジェクトの逆シリアル化中にプロセスが停止するだけです。 コードに問題がありますか?あなたは全体networkstreamだけではなく1024のバイトを読み取る必要がデシリアライゼーション+ソケットでエラーが発生しました

クライアントコード

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バイトだけではありません。あなたは、Deserializeに直接networkstrewamを置くことができます。これは、サーバー側のクラスデータがクライアント側のクラスデータと一致しないためです(クラスデータを保持するクライアントとサーバーの共有DLLを使用します)。 – rene

+0

返信ありがとうございます。私はお勧めしますか? – vivek

+0

ありがとう – vivek

答えて

0

。ネットワークストリームをDeserializeに直接置くことができます。サーバーサイドのクラスdataは、クライアント側でクラスdataと一致していないので、それはとにかく失敗します

(クラスdataを保持し、クライアントとサーバーの共有DLLを使用)

関連する問題