如何通过套接字连接接收大数据流 – 没有TCPClient

我有问题,我想通过SocketConnection发送一个大字符串,但我不能立即收到字符串因为网络限制为1500字节,所以如何在不使用TCPClient的情况下通过Socket接收所有字节,或者这是不可能的。

public string ReceiveString(Socket connection) { byte[] buffer = new byte[1048576]; int recBytes = connection.Receive(buffer); return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes); } 

多数民众赞成,我到目前为止。

如果不可能,通过Socket获取它,我是否可以从Socket中获取EndPoint以使用TCPClient作为“最后一个选项”?

TCP是一个字节流,它没有消息的概念。 线路上各个数据包的大小无关紧要,它只是网络硬件的实现细节。 TCP保证您发送的内容就是您收到的内容(但是单个发送的大小和单个读取的大小之间没有一对一的关系,就像在UDP中一样)。

该解决方案要求发送者以允许读者知道何时停止阅读的方式对字符串数据进行帧化。 或者:

  1. 在发送字符串数据之前发送字符串长度。 然后,读者可以先读取长度,然后读取指定数量的后续字节。

  2. 一个。 使用唯一的分隔符终止字符串,该分隔符不能出现在字符串本身中。 然后读者可以继续阅读,直到遇到分隔符。

    湾 分隔符可以是连接的闭包。 读者可以继续阅读,直到检测到断开连接。

您需要使用哪种解决方案取决于您正在实施的特定协议。 #1最适合二进制协议,并允许有效的内存管理,而#2更适合基于文本的协议,或者提前知道最终长度的流协议。 当#1和#2a不可能时,协议有时必须求助于#2b(HTTP和FTP都使用它)。