【问题标题】:Send different types of messages over socket通过套接字发送不同类型的消息
【发布时间】:2015-01-10 01:52:24
【问题描述】:

我有一个发送不同类型消息的 tcp 客户端,但我有点困惑如何使它工作。首先,客户端发送一个字符串(转换为字节 [])并且工作正常,但随后我尝试发送一个序列化对象,但我不知道如何执行此操作以及如何让服务器了解该消息是不是一个字符串。 我要发送的对象是 RSA 算法的公钥

 IFormatter formatter=new BinaryFormatter();
 formatter.Serialize(client.GetStream(),RSAParameterskeyinfo);

但我不知道如何让服务器了解此消息不是字节[]。

【问题讨论】:

  • 编辑您的问题以显示您如何序列化和发送对象以及您如何尝试读取它
  • 更简单的方法是使用 WCF,它会为您完成所有工作。
  • @JohnSaunders 是的,这也是一个解决方案,但也许他无法访问 .NET 4 和 WCF。 (我有这个问题)
  • 我无法访问.Net 4 还有其他方法吗?
  • @user3475840 我的回答没有帮助?

标签: c# serialization tcp rsa


【解决方案1】:

为了让您的服务器了解他必须计算哪种类型的对象,您必须在客户端和服务器之间共享一个 dll。这里的难点是处理这个 dll 的版本(当你对想要在客户端和服务器之间共享的对象进行更改时,你必须更新每一端的 dll)

然后使用BinaryFormatter 序列化/反序列化您的对象。 首先在客户端用类似的东西序列化你的对象:

MyMessage msg = new MyMessage("My custom message")
byte[] data;
using(var ms = new MemoryStream()) {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(ms, msg);
    data = ms.ToArray();
    /*
     * Send to stream
     */
}

然后在服务器大小上,您必须像这样反序列化它:

/*
 * Get the network stream
 */
BinaryFormatter formatter = new BinaryFormatter();
MyMessage msg = (MyMessage) formatter.Deserialize(myStream);

由于它们共享同一个 dll,所以每一方都知道 Message 对象。

有关BinaryFormatter 的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多