[英]Send List of Strings from Python to C# Using TCP/socket
使用 TCP/套接字将字符串列表从 python 服务器发送到 C# 客户端的首选方法是什么?
我遇到了一些切向相关的来源,但到目前为止,没有任何东西专门解决这个问题(从我有限的网络背景来看)。
一个简单的例子将不胜感激!
谢谢!
Use JSON: ["string 1", "string 2", "string 3"]
If your Python server can use an HTTP protocol (for which there are multiple implementations) you can simply use any of the HTTP clients built into .NET. 这是一个例子:
using System.Text.Json;
using var client = new HttpClient();
var content = await client.GetStringAsync("http://your.server/url");
Console.WriteLine(content);
var stringArray = JsonSerializer.Deserialize<string[]>(content);
有一些方法可以实现这一目标。 使用套接字连接时,您必须处理字节等数据。 因此,与字符串处理不同(您有一个 null 字节标识 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 监听器中,我使用Encoding.ASCII.GetString()
将字节数组转换为字符串,并使用Split()
function 来划分接收到的字符串列表。 我删除了最后一个字符串(在最后一个$
之后),因为它是 0 字节序列(缓冲区的结尾)。
请注意,Sockets 由操作系统处理,因此并不意味着每个send()
或Read()
function 代表一个网络数据包。 所以使用缓冲区大小选项非常重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.