python与C#间socket通讯 | Hlwdy's blog
python与C#间socket通讯
发表于 2020-06-25 共 746 字
分类于 python分类于 C#

python与C#间socket通讯

有时候,我们有些功能想使用不同的编程语言来完成,那么如何将不同编程语言写的程序联系到一起呢

socket(套接字)是一种操作系统提供的进程间通信机制。在操作系统中,通常会为应用程序提供一组应用程序接口,称为套接字接口。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。

而我们这里,就是使用socket来实现各程序之间的通讯,达到互相调用的效果。 套接字之间的连接过程主要分为三个步骤:

1.服务端监听

2.客户端请求

3.连接确认

1.python服务端,C#客户端

以下python代码是对127.0.0.1:9999 (localhost:9999)进行监听,并对请求做出反应,达到服务端的目的

import time,threading,socket

def on_new_connection(client_executor, addr):
    while True:
        msg = client_executor.recv(1024).decode('utf-8')
        if(msg == 'exit'):
            print('%s:%s request close' % addr)
            break
        if(msg == 'test'):
            client_executor.send(bytes('hello!'.encode('utf-8')))
            break

    client_executor.close()

listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(('127.0.0.1', 9999))
listener.listen(5)
print('Waiting for connect...')

while True:
    client_executor, addr = listener.accept()
    t = threading.Thread(target=on_new_connection, args=(client_executor, addr))
    t.start()

然后在C#里,我们引用System.Net

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

在主函数内,编写如下代码,实现对服务端发送请求并接收返回结果。

var host = "127.0.0.1";
var port = 9999;
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
    client.Connect(new IPEndPoint(IPAddress.Parse(host), port));
}
catch{}

client.Send(Encoding.UTF8.GetBytes("test"));//发送"test",服务端应返回"hello"
var bytes = new byte[1024];
var count = client.Receive(bytes);
client.Send(Encoding.UTF8.GetBytes("exit"));
client.Close();
Console.WriteLine(Encoding.UTF8.GetString(bytes, 0, count));

2.python客户端,C#服务端

第二种,反过来,用C#做服务端,实现的功能和上面相同,不过多解释,代码如下:

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            string host = "127.0.0.1";
            int port = 9999;
            listener.Bind(new IPEndPoint(IPAddress.Parse(host), port));
            listener.Listen(5);
            Console.WriteLine("Waiting for connect...");

            while(true){
                var clientExecutor=listener.Accept();
                Task.Factory.StartNew(()=>{
                    var remote=clientExecutor.RemoteEndPoint;
                    var bytes=new byte[1024];
                    while(true){
                        var count=clientExecutor.Receive(bytes);
                        var msg=Encoding.UTF8.GetString(bytes,0,count);
                        if(msg=="exit"){
                            System.Console.WriteLine("{0} request close",remote);
                            break;
                        }
                        if(msg=="test"){
                            clientExecutor.Send(Encoding.UTF8.GetBytes("hello!"));
                            break;
                        }
                        Array.Clear(bytes,0,count);
                    }
                    clientExecutor.Close();
                    System.Console.WriteLine("{0} closed",remote);
                });
            }
        }
    }
}

python客户端:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9999))

client.send('test'.encode('utf-8'))
msg=client.recv(1024)
print(msg.decode('utf-8'))

client.close()

另外,需要注意的是,无论是什么语言编写,都要保证服务端和客户端的数据编码一致,否则会出现乱码的问题。

筛选文章
类别选择 (分类/标签)
全屏 关闭