【问题标题】:Send object to server in C#在 C# 中将对象发送到服务器
【发布时间】:2011-12-17 13:18:59
【问题描述】:

我有一个用 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;

然后它给了我一个错误,因为它不知道对象有什么属性。有人知道怎么做吗?

【问题讨论】:

  • 1.你只想socket吗?还有其他解决方案,例如远程处理或 WCF。当多个客户交流时也比它的问题。 2.另一种方式是通过这种方式先发送SizeofByarray比发送对象数组。
  • 我知道已经很久了。你现在有更好的方法吗?

标签: c# sockets client-server asyncsocket


【解决方案1】:

将它从一个对象转换为Actions

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

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

【讨论】:

    【解决方案2】:

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

    其次,您需要一种方法来指示您传递的对象类型,以便另一端知道如何反序列化它。这可能是按照惯例(相同的调用总是发送相同类型的消息)或在消息流中有附加数据。或者使用不同的序列化程序。

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

    【讨论】:

    • 我无法使用 WCF,因为我使用的是游戏引擎。
    • 我看不出这两件事是如何相互冲突的,除非引擎包含实际的客户端/服务器通信。
    猜你喜欢
    • 2018-09-24
    • 2015-10-13
    • 2011-06-26
    • 1970-01-01
    • 2011-08-02
    • 2011-09-15
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多