我已经开始了我的第一个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
}
最好的方法是什么?为什么?这样可以更好地读取更多数据或使其尽可能小吗?
答案 0 :(得分:0)
TCP是一种流媒体协议,因此如果您想发送多条消息,您应该提供一些方法在消息完成时向另一端指示。
这通常通过首先发送消息的大小,然后是消息本身来完成。所以,是的,你现在正在做的事情的组合就是人们通常做的事情。
但是,您应该记住,数据可能不会一次全部接收 - TCP仅确保按照发送的顺序和子区域接收数据。换句话说:
读取的数据量并不真正相关,传入的数据存储在套接字级别, 读取操作只会清空本地缓冲区。当然不建议逐字节读取。
尺寸很重要,无需为每个单独的字段指定尺寸。但是不要担心额外的几个字节。