Python在网络通讯方面功能强大,今天学习一下Socket通讯的基本方式,分别是UDP通讯和TCP通讯。
UDP通讯
upd 服务端
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 import socket
5
6 ADDR,PORT = 'localhost',7878
7 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
8 sock.bind((ADDR,PORT))
9
10 print 'waiting for connection...'
11
12 while True:
13 data, addr = sock.recvfrom(1024)
14 print('Received data:', data, 'from', addr)
upd客户端
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 import socket
5
6 ADDR,PORT = 'localhost',7878
7 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
8 sock.sendto(b'hello,this is a test info !',(ADDR,PORT))
先开启server端,等待client端的接入,每请求一次client会打印如下内容
waiting for connection...
('Received data:', 'hello,this is a test info !', 'from', ('127.0.0.1', 57331))
('Received data:', 'hello,this is a test info !', 'from', ('127.0.0.1', 61396))
('Received data:', 'hello,this is a test info !', 'from', ('127.0.0.1', 61261))
('Received data:', 'hello,this is a test info !', 'from', ('127.0.0.1', 54875))
TCP通讯
TCP服务端
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 from socket import *
5 import os
6
7 ADDR,PORT = 'localhost',7878
8 sock = socket(AF_INET,SOCK_STREAM)
9 sock.bind((ADDR,PORT))
10 sock.listen(5)
11
12 while True:
13 conn,addr = sock.accept()
14 print "new conn:",addr
15 while True:
16 print 'waiting for connection'
17 data = conn.recv(1024)
18 if not data:
19 print '客户端已经断开'
20 break
21 print '执行指令',data
22 cmd_res = os.popen(data).read() #为执行传回的指令
23 if len(cmd_res) == 0:
24 print 'cmd has no output...'
25
26 conn.send(str(len(cmd_res)).encode('utf-8')) #发送大小
27 #client_chk = conn.recv(1024) 解决粘包问题 #wait client to confirm
28 conn.send(cmd_res)
29 print 'send done'
30 conn.close()
31 sock.close()
TCP客户端
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 from socket import *
4
5 ADDR,PORT = 'localhost',7878
6 sock = socket(AF_INET,SOCK_STREAM)
7 sock.connect((ADDR,PORT))
8 while True:
9 data = raw_input('>>')
10 sock.send(data)
11 print('发送信息到%s:%s' % (host, data))
12 cmd_size = sock.recv(1024)
13 print '命令结果大小 size',cmd_size
14 sock.send('准备好接收了,可以发了')
15 received_size = 0
16 received_data = b''
17 while received_size < int(cmd_size):
18 data = sock.recv(1024)
19 received_size += len(data)
20 received_data += data
21 print received_size
22 else:
23 print '=================\r\n'
24 print 'cmd receive done',received_size
25 print 'receive data:\r\n',received_data
26
27 sock.close()