python - 使用 TCP/socket 将字符串列表从 Python 发送到 C#

标签 python c# sockets tcp

使用 TCP/套接字将字符串列表从 python 服务器发送到 C# 客户端的首选方法是什么?
我遇到过一些无关紧要的相关资料,但到目前为止,还没有任何内容专门解决这个问题(从我有限的网络背景来看)。

如果有一个简单的例子,我们将不胜感激!

谢谢!

最佳答案

有一些方法可以实现这一目标。使用套接字连接时,您必须处理字节等数据。因此,与字符串处理(有一个空字节标识 char 数组的末尾)不同,您不知道字节数组的末尾在哪里。因此,确定缓冲区大小并识别字符串结尾是一个很好的做法。

一种解决方案,无需进行错误处理以简化阅读:

Python 客户端:

import socket

host = "127.0.0.1"
port = 8080

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dest = (host, port)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 256) #256 -> expected packet length

print("Connecting ...")
sock.connect(dest)
print("OK")

list = ["first string", "second string", "third string"]

for i in range(len(list)):
    sock.send(str.encode(list[i] + "$"))
    print("Sending " + list[i])

sock.close()

C# TCP 监听器:

using System.Net.Sockets;
using System.Text;

TcpListener listener = new TcpListener(System.Net.IPAddress.Any, 8080);
listener.Start();

Console.WriteLine("Waiting for TCP connection ...");

TcpClient tcp = listener.AcceptTcpClient();

tcp.ReceiveBufferSize = 256; //Expected packet length in bytes

Console.WriteLine("Receiving string list ...");

int received_bytes_count = -1;
byte[] total_buffer = new byte[1024]; //Expected total bytes in a string list
while(received_bytes_count != 0)
{
    int total_buffer_index = received_bytes_count + 1;

    NetworkStream ns = tcp.GetStream();
    byte[] buffer = new byte[tcp.ReceiveBufferSize];
    received_bytes_count = ns.Read(buffer, 0, buffer.Length);

    buffer.CopyTo(total_buffer, total_buffer_index);
}

List<string> list = new List<string>();
list.AddRange(Encoding.ASCII.GetString(total_buffer).Split('$'));
list.RemoveAt(list.Count - 1); //remove the null string after the last '$'

tcp.Close();

foreach (string s in list.ToArray())
    Console.WriteLine(s);

在此示例中,我将数据包大小固定为 256 字节,将字符串列表大小固定为 1024 字节。我使用 $ 来标识每个字符串的结尾。

在 C# Tcp Listener 中,我使用 Encoding.ASCII.GetString() 将字节数组转换为字符串,并使用 Split() 函数划分整个字符串在字符串列表中接收。我删除了最后一个字符串(在最后一个 $ 之后),因为它是 0 字节序列(缓冲区末尾)。

请注意,套接字是由操作系统处理的,因此并不意味着每个 send()Read() 函数都代表一个网络数据包。因此,使用缓冲区大小选项非常重要。再举个例子,Nagle 算法旨在减少网络流量,操作系统稍等片刻以收集应用程序使用 send() 函数发送的数据,然后发送一个包含所有数据的数据包在一起,而不是发送小数据包,这会通过更多控制数据来增加网络流量。您可以使用 setsockopt() 关闭 Nagle 算法以提高性能,但我认为您所使用的应用程序并非如此。只是要明白,一个send()函数并不代表一个数据包,因此并不意味着一台服务器的Read()函数只会接收到一个客户端的数据send() 函数。有关 Nagle 算法的更多详细信息: https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.nodelay?view=net-6.0

关于python - 使用 TCP/socket 将字符串列表从 Python 发送到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73841350/

相关文章:

python - 在 pandas DataFrame 中每组选择 1 个 True,1 个 False

python - 如何检查Inno Setup中是否安装了特定的Python版本?

c# - 如何从 C#/WPF 中的嵌套属性获取通知?

php - 使用PHP在Google Talk XMPP TCP连接上使用TLS

python - 如何用python-poppler-qt4显示PDF?

python - 我在梯度下降中遇到问题,它给我的 thetas 没有

C# 使用具有相同值的多个键打开枚举

javascript - 使用 ajax 返回 Controller 方法值

c - 服务器和客户端对一个公共(public)端口号显示的不同端口号

c# - 来自 UWP 的 MySQL 远程连接有套接字错误,但 TCP 连接