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);
// ...
}