Py学习  »  Python

c tcp服务器同时接收python客户端发送的两条消息

Ivan Zlatanov • 6 年前 • 786 次点击  

我正在尝试接收python tcp客户机发送到c服务器的多条消息。 我确实收到了数据,但我不希望这一切发生。 我试图将服务器缓冲区大小设置为要发送的字节[]的大小,但它不起作用( source )中。 有什么办法可以解决这个问题吗?

客户端发送代码:

import socket


def send_to_remote(sock, data):

data_bytes = bytearray()
data_bytes.extend(map(ord, data)) # appending the array with string converted to bytes

bytes_length = len(data_bytes) # length of the array that I am sending

sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bytes_length) #   setting the buffer size to the array length

print(bytes_length)

sock.send(data_bytes) # sending the data

服务器接收代码:

 public static string ReadData(TcpClient connection)
    {
        StringBuilder receivedDataStr = new StringBuilder();
        NetworkStream connectionStream = connection.GetStream();

        if (connectionStream.CanRead)
        {
            byte[] connectionBuffer = new byte[connection.ReceiveBufferSize];

            Console.WriteLine(">> Reading from NODE");

            int bytesRead = 0;

            bytesRead = connectionStream.Read(connectionBuffer, 0, 1024);
            receivedDataStr.Append(Encoding.ASCII.GetString(connectionBuffer, 0, bytesRead));

            Console.WriteLine(">> " + connection.ReceiveBufferSize);

            return receivedDataStr.ToString();
        }
        else
        {
            Console.WriteLine(">> Can't read from network stream");
            return "none-read";
        }
    }

编辑:

我做的是:

send_to_remote(socekt, "msg1")
send_to_remote(socekt, "msg1")

然后:

string msg1 = ReadData(client);
string msg2 = ReadData(client);

我收到106200的缓冲区数组。

结果是:

"msg1 (then new line) msg2"
"" (string msg2 is waiting for data)

提前谢谢你!啊!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47370
文章 [ 1 ]  |  最新文章 6 年前
Marc Gravell
Reply   •   1 楼
Marc Gravell    7 年前

TCP是 流动 协议,不是 小包裹 协议。有 绝对没有保证 您将获得与发送数据完全相同的数据块—所保证的是,您将获得正确顺序的字节(或失败或超时等)。您可以分别获取每个字节,或者一次获取14条消息。或介于两者之间的任何东西,包括一个接收中的一半消息,以及下一个接收中的另一半消息。在unicode(etc)的情况下,这也意味着可以在多个接收端拆分单个字符。

任何基于TCP的多消息协议都需要包含 框架 ,也就是说,您可以通过某种方式知道每个单独消息的开始和结束位置。由于您使用的是基于文本的协议,一个常见的选项是使用CR、LF或CR+LF分隔逻辑消息,然后您的工作是缓冲数据,直到您有一个完整的消息为止,方法是查找行结尾。对于完整性:在二进制协议的情况下,通常使用某种表示有效负载中数据量的头作为有效负载的长度前缀,然后您只需要解析头、确定长度和缓冲区,直到您有那么多数据。

在具有文本协议且无挑战性可伸缩性问题的简单应用程序中,可以使用 StreamReader (在 NetworkStream )为你做那部分,然后用 ReadLine ReadLineAsync .不过,请注意,这在“真正的”服务器中是个坏主意(尤其是 阅读线 )-你不希望恶意的或有缺陷的客户端仅仅因为发送了几个字符就永远锁定一个线程 没有行尾 ,然后没有发送任何其他…永远。当然,在一个严肃的服务器中,你不会在每个客户机上使用线程 无论如何 是的。