Fork me on GitHub

python与C#间socket通讯

python与C#间socket通讯

有时候,我们有些功能想使用不同的编程语言来完成,那么如何将不同编程语言写的程序联系到一起呢
socket(套接字)是一种操作系统提供的进程间通信机制。在操作系统中,通常会为应用程序提供一组应用程序接口,称为套接字接口。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。

而我们这里,就是使用socket来实现各程序之间的通讯,达到互相调用的效果。

套接字之间的连接过程主要分为三个步骤:
1.服务端监听
2.客户端请求
3.连接确认

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

1
2
using System.Net;
using System.Net.Sockets;

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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#做服务端,实现的功能和上面相同,不过多解释,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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客户端:

1
2
3
4
5
6
7
8
9
10
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()

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