如何使用套接字将数据从 C# 发送到 python?

How to send data from C# to python using sockets?

我找不到关于如何将数据从 C# 发送到 python 的任何示例或教程。

在我的应用程序中,C# 应该不断从硬件读取数据并将其发送到 python 进行处理。我曾尝试在 python 上创建一个基本服务器,在 C# 上创建一个基本客户端,但我始终无法使用 C# 的以下输出在客户端和服务器之间建立连接 无法建立连接因为目标机器主动拒绝了。我在 python 客户端上测试了我的 python 服务器,我能够很好地建立连接。

如何使用套接字将数据从 C# 正确发送到 python?有没有我可以遵循的示例教程?我的代码有问题吗?这里是:

Python 服务器代码:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1234))
s.listen(5)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!")
    clientsocket.send(bytes("Welcome to the server!", "utf-8"))
    clientsocket.close()

C# 客户端代码:

 static void ExecuteClient()
        {

            try
            {

                IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress ipAddr = ipHost.AddressList[0];
                IPEndPoint localEndPoint = new IPEndPoint(ipAddr, 1234);

                Socket sender = new Socket(ipAddr.AddressFamily,
                           SocketType.Stream, ProtocolType.Tcp);

                try
                {
                    sender.Connect(localEndPoint);

                    Console.WriteLine("Socket connected to -> {0} ",
                                  sender.RemoteEndPoint.ToString());

                    byte[] messageReceived = new byte[1024];

                    int byteRecv = sender.Receive(messageReceived);
                    Console.WriteLine("Message from Server -> {0}",
                          Encoding.ASCII.GetString(messageReceived, 0, byteRecv));

                    sender.Shutdown(SocketShutdown.Both);
                    sender.Close();
                }

                // Manage of Socket's Exceptions 
                catch (ArgumentNullException ane)
                {

                    Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
                }

                catch (SocketException se)
                {

                    Console.WriteLine("SocketException : {0}", se.ToString());
                }

                catch (Exception e)
                {
                    Console.WriteLine("Unexpected exception : {0}", e.ToString());
                }
            }

            catch (Exception e)
            {

                Console.WriteLine(e.ToString());
            }
        }

我知道这个问题很老了,但万一其他人在他们的互联网搜索中偶然发现了这里。

我刚刚开始学习 Python,我正在处理与我的 Raspberry Pi (SERVER) 和 Windows PC (CLIENT) 类似的情况。

问题是您正在调用以获取每台计算机上的主机名。这显然会有所不同。您的客户端需要连接到服务器的地址。您的客户端代码正在尝试连接到 运行 的机器,但该连接被拒绝。从未联系过服务器。

我进行了以下更改并能够建立连接。

Python 服务器代码:

s.bind(("", 1234))

C# 客户端代码:

//IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
//IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("[SERVER IP]"), 1234);

服务器控制台响应:

Connection from ('[CLIENT IP]', 52074) has been established!   

客户端控制台响应:

Socket connected to -> [::ffff:[SERVER IP]]:1234 
Message from Server -> Welcome to the server!