C# TcpListener服务器-处理数据

C# TcpListener服务器-处理数据,c#,sockets,tcpclient,C#,Sockets,Tcpclient,我已经开始了我的第一个套接字项目,我想知道我应该如何通过 服务器客户端 我应该创建序列化类,使用最大缓冲区大小,不考虑字节,还是让它全部同步,只在需要时读取和发送字节 序列化(代码的一部分): 或者使其完全同步: private void ReadStream() { int bytes = ReadBytesInt(4); // read size of string Message string Message = ReadBytesStr(bytes); var Type =

我已经开始了我的第一个套接字项目,我想知道我应该如何通过
服务器客户端

我应该创建序列化类,使用最大缓冲区大小,不考虑字节,还是让它全部同步,只在需要时读取和发送字节

序列化(代码的一部分):

或者使其完全同步:

private void ReadStream() {
  int bytes = ReadBytesInt(4); // read size of string Message
  string Message = ReadBytesStr(bytes);
  var Type = (DataTypes)ReadBytesInt(4);
  bytes = ReadBytesInt(4); // read size of Data

  if (Type == DataTypes.Register) {
    RegisterClass.ReadStream();
  }
  // ...
}

private void RegisterClass.ReadStream() {
  int id = ReadBytesInt(4);
  // Read rest of data
}
或者把它结合起来?大概是这样的:

private void ReadStream() {
  int bytes = ReadBytesInt(4); // read size of SerializedData object
  var dataInfo = (SerializedData)ReadBytesAndDeserialize(bytes);
  // ...
}

最好的方法是什么?为什么?这是一次读取更多数据还是使其尽可能小

TCP是一种流协议,因此如果您想发送多条消息,则应提供某种方式,在消息完成时向另一端指示

这通常是通过先发送消息的大小,然后发送消息本身来完成的。是的,你现在所做的是人们通常所做的

但是,您应该记住,数据可能不会一次全部接收到—TCP只确保数据按照发送顺序接收,而不是按子队列接收。换言之:

  • 继续阅读,直到您阅读了传入消息的大小
  • 在传入消息的一侧创建缓冲区
  • 继续读取,直到缓冲区被填满
读取的数据量实际上并不相关,传入的数据存储在套接字级别,您的读取操作只是清空本地缓冲区。当然,不建议逐字节读取

大小很重要,不需要为每个单独的字段指定大小。但是,不要担心额外的几个字节

private void ReadStream() {
  int bytes = ReadBytesInt(4); // read size of SerializedData object
  var dataInfo = (SerializedData)ReadBytesAndDeserialize(bytes);
  // ...
}