0

我已经使用 TcpClient 将数据作为字节发送,我想发送我自己的类而不是数据字节。

通过数据字节,我的意思是我正在发送转换为字节的数据,如下所示:

using (MemoryStream bufferStream = new MemoryStream())
{
    using (BinaryWriter bufferData = new BinaryWriter(bufferStream))
    {
        // Simple PONG Action
        bufferData.Write((byte)10);
    }

    _logger.Info("Received PING request, Sending PONG");
    return bufferStream.ToArray();
}

相反,我想像这样发送它,而不必声明它的大小或 w/e

public class MyCommunicationData
{
    public ActionType Action { get; set; }
    public Profile User { get; set; }
    ...
}

通常,当我以字节形式发送数据时,前 5 个字节用于指示操作和消息大小。

但是,如果我迁移以将所有数据序列化为一个类,我是否仍然需要发送它是什么动作和大小,或者使用客户端和服务器知道要读取什么等的序列化消息,或者有没有办法这样做我可以无需从序列化对象中指定内容即可发送它?

不确定这是否重要,我正在使用AsyncCallback读写网络流:

_networkStream = _client.tcpClient.GetStream();
_callbackRead = new AsyncCallback(_OnReadComplete);
_callbackWrite = new AsyncCallback(_OnWriteComplete);

如果您需要我发布任何其他功能,请告诉我。

4

1 回答 1

2

如果您使用基于文本的序列化程序(例如 Json),您可以使用 StreamReaderReadLine和 StreamWriter WriteLine(从 tcpClient.GetStream 创建)。

您的代码将类似于

 writer.WriteLine(JsonConvert.SerializeObject(commData))

并在另一端获取数据

var myobj = JsonConvert.DeserializeObject<MyCommunicationData>(reader.ReadLine())

- 编辑 -

//**Server**
Task.Factory.StartNew(() =>
{
    var reader = new StreamReader(tcpClient.GetStream());
    var writer = new StreamReader(tcpClient.GetStream());
    while (true)
    {
        var myobj = JsonConvert.DeserializeObject<MyCommunicationData>(reader.ReadLine());
        //do work with obj 
        //write response to client
        writer.WriteLine(JsonConvert.SerializeObject(commData));
    }
}, 
TaskCreationOptions.LongRunning);
于 2012-10-04T06:52:03.413 回答