C#TCP服务器一次接收到Python客户端发送的两条消息

时间:2019-03-14 16:55:13

标签: c# python .net sockets tcp

我正在尝试接收Python TCP客户端发送到C#服务器的多条消息。 我确实收到了数据,但是一次全部接收,我不希望发生这种情况。 我试图将服务器缓冲区的大小设置为我要发送的byte []的大小,但是它不起作用(source)。 有什么想法可以解决此问题吗?

客户端发送代码:

#include <stddef.h>

/* ... */

  constexpr size_t offset_c = offsetof( Foo, c );
  printf( "%zu\n", offset_c );
  cout << offset_c << '\n';

服务器接收代码:

SELECT COUNT(*) FROM system_schema.tables WHERE keyspace_name = 'yourkeyspace' AND table_name = 'yourtable';

编辑:

我要做的是:

IF NOT EXISTS

然后:

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

我收到106200的缓冲区数组。

结果是:

 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";
        }
    }

提前谢谢!

1 个答案:

答案 0 :(得分:1)

TCP是 stream 协议,而不是 packet 协议。 绝对不能保证,您将获得与发送时相同的数据块-所保证的是,您将以正确的顺序获取字节(否则将失败) ,或超时等)。您可以分别获取每个字节,或一次获取14条消息。或两者之间的任何内容,包括一次接收一半的消息,另一半接收另一半的消息。对于unicode等,这也意味着可以将单个字符拆分为多个接收。

任何基于TCP的多消息协议都需要包含某种 framing ,即,您可以通过某种方式来了解每个单独的消息的开始和结束位置。由于您使用的是基于文本的协议,因此常见的选择是使用CR,LF或CR + LF分隔逻辑消息-然后,通过查找以下内容来缓冲数据,直到获得完整的消息为止。行尾。为完整起见:在二进制协议的情况下,通常使用一些标头对长度有效载荷进行前缀,以指示有效载荷中的数据量,然后只需要解析标头,确定长度并缓冲直到有那么多数据。

在具有文本协议并且没有挑战性的可扩展性问题的简单应用程序中,可能可以使用StreamReader(在NetworkStream之上)为您完成这部分工作,然后只需使用{{ 1}}或ReadLine。但是请注意,在“真实”服务器(尤其是ReadLineAsync)中,这是个坏主意-您不希望恶意或仅仅有漏洞的客户端永远仅因为线程发送了几个字符而锁定了线程没有行结束,然后就什么也没发。当然,在严肃的服务器中,无论如何,每个客户端都不会使用线程。