2016-08-24 50 views
1

我有问题,我想通过SocketConnection发送大字符串,但由于网络有限,我无法一次接收字符串到1500字节,所以我如何通过Socket接收所有字节而不使用TCPClient,或者这是不可能的。如何通过套接字连接接收大数据流 - 无TCPClient

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

那是,我至今。

如果它不可能,通过套接字,我可以从套接字中获取EndPoint以使用TCPClient作为“最后的选项”?

+0

您必须自己实施[协议级别](https://en.wikipedia.org/wiki/OSI_model#Layer_4:_Transport_Layer)以将数据拆分为数据包并接收(连接)它们。 – Sinatr

+0

你不行。 TCP将每条消息分解为大约1500字节的数据报。当您应该使用异步方法时,您正在使用同步Receive()方法。您需要在发送功能中添加终止字符,以便接收功能可以继续读取1500个数据报,直到找到结束字符。 – jdweng

+0

TCP是否有某种类型的结束序列,我的意思是,我听说过\ 0? – Silent3241

回答

3

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

该解决方案要求发件人以允许读者知道何时停止阅读的方式来构造字符串数据。可以是:

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

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

    b。分隔符可以关闭连接。阅读器可以继续阅读,直到检测到断开连接。

您需要使用哪种解决方案取决于您正在实施的特定协议。 #1对于二进制协议来说是最好的,并且允许高效的内存管理,而#2更适合基于文本的协议或流式协议,其中最终长度并不提前知道。当#1和#2a是不可能的时候,有时协议不得不求助于#2b(HTTP和FTP都将它作为时间使用)。

+0

或切换到一个更高级别的协议,建立在TCP之上,为您实现消息/帧。 –

+0

@Damien_The_Unbeliever你可能会想到更多的预制库而不是协议。如果您只是设计/采用消息传递协议,则仍然需要实现用于发送和阅读消息帧的代码。 –

+0

那么,我正在考虑“切换到HTTP”或类似的。即一个建立在TCP之上的协议,已经有一个消息传递的概念。 –