在C#中将对象发送到服务器

时间:2011-12-17 13:19:00

标签: c# sockets client-server asyncsocket

我有一个用C#编写的客户端/服务器应用程序。当我向服务器发送字符串消息时它工作正常。但我需要将(简单)对象发送到服务器而不是字符串。但我不知道该怎么做。我目前为我的客户提供此服务:

我要发送的课程:

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

然后我使用默认的Send()命令发送对象。但在发生这种情况之前,我首先将Actions类转换为字节数组,如下所示:

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();
}

在服务器端,我收到这样的数据(这就是我被困在......):

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;

然后它给了我一个错误,因为它不知道对象有什么属性。任何人都知道如何做到这一点??

2 个答案:

答案 0 :(得分:2)

将其从对象投射到Actions

object Cls = this.ByteArrayToObject ( socketData.dataBuffer );
Actions action = (Actions)Cls;

这是最简单的方法。您还应该添加异常处理,类型检查等。

答案 1 :(得分:1)

通常,客户端和服务器都需要知道可以通过连接序列化的对象类型。

其次,您需要一种方法来指示您传递的对象类型,因此另一端知道如何反序列化它。这可以按照惯例(相同的调用始终发送相同类型的消息)或消息流中的其他数据。或者使用不同的序列化器。

你有没有看过WCF?它提供了通过数据合同很好地抽象所有这些的方法。