TcpListener服务器 - 处理数据

时间:2015-05-22 18:07:28

标签: c# sockets tcpclient

我已经开始了我的第一个Socket项目,我想知道如何通过
阅读和发送数据 服务器< =>客户

我是否应该使用序列化类,使用最大缓冲区大小并且不要记住字节,或者只在需要时使其全部同步,读取和发送字节。

Serialize(部分代码):

func flag(country:String) -> String {
    let base : UInt32 = 127397
    var s = ""
    for v in country.unicodeScalars {
        s.unicodeScalars.append(UnicodeScalar(base + v.value)!)
    }
    return String(s)
}

或者让它完全同步:

// TcpDLL
[Serializable]
public class SerializedData {
  public string Message { get; set; }
  public DataTypes Type { get; set; }
  public object Data { get; set; }
}

private void ReadStream() {
  // ...
  stream.BeginRead(buffer, 0, MAX_BUFFER_SIZE, new AsyncCallback(ReadAsync), stream);
  // ...
}

private void ReadAsync() {
  // ...
  var dataInfo = (SerializedData)BinaryFormatter.Deserialize(new MemoryStream(buffer));

  if (dataInfo.Type == DataTypes.Register) {
    var data = (RegisterClass)dataInfo.Data;
  }
  // ...
}

或者可能结合起来?像这样:

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
}

最好的方法是什么?为什么?这样可以更好地读取更多数据或使其尽可能小吗?

1 个答案:

答案 0 :(得分:0)

TCP是一种流媒体协议,因此如果您想发送多条消息,您应该提供一些方法在消息完成时向另一端指示。

这通常通过首先发送消息的大小,然后是消息本身来完成。所以,是的,你现在正在做的事情的组合就是人们通常做的事情。

但是,您应该记住,数据可能不会一次全部接收 - TCP仅确保按照发送的顺序和子区域接收数据。换句话说:

  • 继续阅读,直到您阅读了传入消息的大小
  • 在传入消息的一侧创建一个缓冲区
  • 继续阅读,直到填充缓冲区

读取的数据量并不真正相关,传入的数据存储在套接字级别, 读取操作只会清空本地缓冲区。当然不建议逐字节读取。

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

相关问题