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

时间:2016-08-24 09:30:28

标签: c# sockets

我有问题,我想通过SocketConnection发送一个大字符串,但我不能立即收到字符串,因为网络限制为1500字节,所以我怎么能接收所有字节没有使用TCPClient的套接字,或者只是不可能。

    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作为"最后一个选项"?

1 个答案:

答案 0 :(得分:3)

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

该解决方案要求发送方以这样的方式对字符串数据进行帧化,以便读者知道何时停止阅读。之一:

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

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

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

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