繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM