2011-12-17 9 views
3

私はC#で作られたクライアント/サーバアプリケーションを持っています。サーバーに文字列を送信すると正常に動作します。しかし、私は(単純な)オブジェクトをStringsの代わりにサーバーに送る必要があります。しかし、私はこれを行う方法がわかりません。私は現在、私のクライアントのためにこれを持っている:C#でサーバにオブジェクトを送信する

私が送信したいクラス:

[Serializable] 
public class Actions 
{ 
// Movement 
public bool forward = false; 
public bool left = false; 
public bool backward = false; 
public bool right = false; 
} 

を、私はデフォルトの送信()コマンドを使用してオブジェクトを送信します。サーバー側では

public void SendObject (object obj) 
{ 
    this.socket.Send (this.ObjectToByteArray (obj)); 
} 

// Convert an object to a byte array 
private byte[] ObjectToByteArray(object obj) 
{ 
    if(obj == null) 
     return null; 

    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, obj); 
    return ms.ToArray(); 
} 

私は(...とthatsのiがで立ち往生していた)、このようなデータを受信します。しかし、その前に私が最初にそうようにバイト配列にアクションクラスを変換happends :私は、サーバー上のオブジェクトにアクセスすることができ、そうすること

public void OnDataReceived(IAsyncResult asyn) 
{ 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
    try 
    { 
     // Complete the BeginReceive() asynchronous call by EndReceive() method 
     // which will return the number of characters written to the stream 
     // by the client 
     int iRx = socketData.m_currentSocket.EndReceive (asyn); 
     char[] chars = new char[iRx + 1]; 

     // CONVERT THE BYTE ARRAY BACK TO AN OBJECT 
     //object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
    } 
    catch (...) { } 
} 

は何がありますか?明らかに私が行うとき: Cls.forward;

次に、オブジェクトにどのようなプロパティがあるかわからないため、エラーが表示されます。誰もこれを行う方法を任意のアイデア?? Actionsにオブジェクトから

+0

1.ソケットのみにしたいですか?リモート処理やWCFのような他のソリューションがあります。また、複数のクライアントがその問題よりも通信する場合。 2.別の方法は、この方法でパスします。 最初に送信するSizeofByarray オブジェクト配列を送信します。 – dotnetstep

答えて

2

キャスト、それを:

それを行うための最も簡単な方法はあります
object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
Actions action = (Actions)Cls; 

+0

ありがとう、優れた作品。 – w00

1

一般に、クライアントとサーバーの両方は、接続を介してシリアル化できるオブジェクトの種類について知る必要があります。

第2に、渡しているオブジェクトの種類を示す方法が必要です。そのため、もう一方の端はどのようにオブジェクトを逆シリアル化するかを知っています。これは、慣例によって(同じ呼び出しが常に同じ種類のメッセージを送信する)、またはメッセージストリーム内の追加データを使用して行うことができます。または、別のシリアライザを使用します。

あなたはWCFをまったく見ましたか?これは、データ契約を通じてこれをすべてうまく抽象化する方法を提供します。

+0

私はゲームエンジンを使用しているため、私はWCFを使用できません。 – w00

+0

エンジンに実際のクライアント/サーバー通信が含まれていない限り、これらの2つのことがどのように矛盾しているかわかりません。 – Joe

関連する問題