c# - C#发送对象到服务器

标签 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;

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

最佳答案

将其从对象转换为Actions:

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

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

关于c# - C#发送对象到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8545013/

相关文章:

c# - 什么是解构编译器? C# 如何获得动态语言在运行时通过 Roslyn 生成和调用代码的能力?

sockets - 为什么在一台计算机内使用本地管道而不是套接字进行程序通信?

PHP 套接字 I/O 方法

c# - Entity Framework - 不映射到数据库表的抽象基类

c# - asp.net中如何实现URL重写

c# - 使用 NetComm dll 发送屏幕截图到主机

java - 我可以将来自 java 的哈希码与来自 javascript 的哈希码进行比较吗?

当 recv() 不是预期的字节数时,C 程序挂起

c# - 访问 SD 卡被拒绝 - UWP

python - 为什么在重新使用打开的端口之前会出现一段时间延迟?