我有一个问题,我想通过 SocketConnection 发送一个大字符串,但我无法立即接收到该字符串,因为网络限制为 1500 字节,所以我如何通过 Socket 接收所有字节而不使用 TCPClient,或者这是不可能的。
public string ReceiveString(Socket connection)
{
byte[] buffer = new byte[1048576];
int recBytes = connection.Receive(buffer);
return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes);
}
这就是我目前所拥有的。
如果不可能,要通过套接字获取它,我能否从套接字中获取端点以使用 TCPClient 作为“最后一个选项”?
请您参考如下方法:
TCP是字节流,没有消息的概念。线路上单个数据包的大小无关紧要,它只是网络硬件的一个实现细节。 TCP 保证你发送的就是你收到的(但在单个发送的大小和单个读取的大小之间没有一对一的关系,就像在 UDP 中那样)。
该解决方案要求发送方以允许读者知道何时停止阅读的方式构建字符串数据。要么:
在发送字符串数据之前发送字符串长度。然后读取器可以先读取长度,然后读取指定数量的后续字节。
一个。使用不能出现在字符串本身中的唯一分隔符终止字符串。然后读者可以继续阅读,直到遇到分隔符。
分隔符可以是连接的关闭。读者可以继续阅读,直到检测到断开连接。
您需要使用哪种解决方案取决于您正在实现的特定协议(protocol)。 #1 最适合二进制协议(protocol),并允许高效的内存管理,而#2 更适合基于文本的协议(protocol),或无法提前知道最终长度的流式协议(protocol)。有时当#1 和#2a 不可能时,协议(protocol)不得不求助于#2b(HTTP 和 FTP 都使用它作为时间)。
