python socket 学习

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 '=================
'
24         print 'cmd receive done',received_size
25         print 'receive data:
',received_data
26 
27 sock.close()
原文地址:https://www.cnblogs.com/gide/p/6137604.html