2011-06-23 19 views
0

私は、サーバーとクライアントの2つの部分を持つC#アプリケーションを作成しようとしています。クライアントはネットワークを介してサーバーと通信する必要があります(テストする場合、両方の部分がローカルコンピュータ上で "127.0.0.1"で通信する)。私はソケットとシリアライゼーションを組み合わせようとしましたが、運がありませんでした。ネットワーク経由でオブジェクトを送信する

私はシリアル化し、このような単純な(テスト)オブジェクトを送信しようとしている:

[Serializable] 
class Test 
{ 
    public string msg="default"; 
} 

このクラスはサーバーとクライアントコードの両方で定義されています。

送信するコードは次のようになります。

try 
{ 
    Test tst = new Test(); 
    tst.msg = "TEST"; 

    NetworkStream ns = new NetworkStream(m_socWorker); 
    MemoryStream ms = new MemoryStream(); 
    BinaryFormatter bf = new BinaryFormatter(); 

    bf.Serialize(ms, tst); 

    m_socWorker.Send(ms.ToArray()); 
} 
catch(System.Net.Sockets.SocketException se) 
{ 
    MessageBox.Show (se.Message); 
} 

受信コードは次のようになります。

public void OnDataReceived(IAsyncResult asyn) 
{ 
    try 
    { 
     CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ; 
     //end receive... 

     Test tst; 
     byte[] buffer = new byte[1024]; 
     m_socWorker.Receive(buffer); 

     BinaryFormatter bin = new BinaryFormatter(); 
     MemoryStream mem = new MemoryStream(buffer); 

     tst = (Test)bin.Deserialize(mem); 
     txtDataRx.Text = tst.msg; 
     theSockId.thisSocket.EndReceive(asyn); 
    } 
    catch (ObjectDisposedException) 
    { 
     System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n"); 
    } 
    catch(SocketException se) 
    { 
     MessageBox.Show (se.Message); 
    } 
} 

私はデータを送信するとき、私は例外受け取る - タイプの

」例外」をSystem.OutOfMemoryException 'がスローされました。

"デシリアライズ"行を指しています。

問題を引き起こしているコード内にはっきりと明白なことはありますか?

+1

なぜWCFを使用していませんか? –

+1

[基本的なWindows Communication Foundationの概念](http://msdn.microsoft.com/en-us/library/ms731079.aspx) – crashmstr

+0

まあ...私はWFCに精通していません。私はそれを使用しませんでした – guest86

答えて

1

私はテストのためにあなたのコードを簡素化することをお勧め:

  1. は、単純な文字列(最初にこれを検証するためのミックスから直列化を排除する)を使用して、ネットワークソケットのコードをテストします。

  2. シリアライズ/デシリアライズコードを(ネットワークソケットの複雑さを増やさずに)直接テストします。

  3. あなたは別に、あなたがそれらを一緒に入れての作業を開始することができ、両方の作品のより良い理解を持っていたら...

+0

私はシリアル化するとき/私は "オブジェクトのマップ"例外:\ – guest86

+0

文字列をシリアル化する必要はありません文字列をdeserialize文字列をシリアル化する必要はありません。バイト配列に変換するだけです... – Scrappydog

+0

文字列は大きな問題ではありませんが、カスタムオブジェクトですか? :D – guest86

関連する問題