我使用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);
如果您需要我发布任何其他功能,请告诉我。
答案 0 :(得分:2)
如果您使用基于文本的序列化程序(例如,Json),您可以使用StreamReader的ReadLine
和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);