原文链接:http://www.limerence2017.com/2018/01/02/python20/
python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库
建议采用C/C++做底层封装,采用epoll、poll、iocp等网络模型封装,编译成网络库
供其他模块使用。这里在python学习过程中介绍一下
TCP 编程 服务器端
1 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AF_INET表示网络通信,SOCK_STRAM表示面向字节流TCP方式通信。
2 绑定端口和地址
s.bind((‘127.0.0.1’,9999))
3 监听套接字
s.listen(5)
5,表示监听队列最大多长。
4 接收客户端连接
sock, addr = s.accept()
s为生成的socket,accept接收客户端连接,返回对端描述符和地址
5 接收数据
data = sock.recv(1024)
sock为对端socket,recv接收数据,最多接收1024
6 发送数据
sock.send((‘Hello, %s’ %data.decode(‘utf-8’)).encode(‘utf-8’))
7 关闭描述符
sock.close()
TCP客户端编程
1 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2 建立连接
、
s.connect((‘127.0.0.1’, 9999))
3 接收消息和发送消息
s.send(data)
s.recv(1024).decode(‘utf-8’)
4 关闭描述符
s.close()
服务端案例:
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
|
import socket import threading import time
#线程处理函数 def tcplink(sock, addr): print('Accept new connection from %s:%s...' % addr) sock.send(b'Welcome!') while True: data = sock.recv(1024) time.sleep(1) if not data or data.decode('utf-8')=='exit': break sock.send(('Hello, %s' %data.decode('utf-8')).encode('utf-8')) sock.close() print('Connection from %s:%s closed.'%addr)
#服务器tcp编程流程 #创建套接字 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #绑定套接字 s.bind(('127.0.0.1',9999)) #监听套接字 s.listen(5)
print('Waiting for connection...') # 调用accept接受连接 while True: # 接收新的连接 sock, addr = s.accept() # 创建新的线程处理TCP t = threading.Thread(target=tcplink,args=(sock,addr)) t.start()
|
客户端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
import socket
#创建一个socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('127.0.0.1', 9999)) # 接收欢迎消息: print(s.recv(1024).decode('utf-8')) for data in [b'Michael', b'Tracy', b'Sarah']: # 发送数据: s.send(data) print(s.recv(1024).decode('utf-8')) s.send(b'exit') s.close()
|
UDP通信
udp通信和tcp通信不一样,很简单。服务器端不需要监听和accept,
客户端也不需要connect。
服务端 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口: s.bind(('127.0.0.1', 9999))
print('Bind UDP on 9999...') while True: # 接收数据: data, addr = s.recvfrom(1024) print('Received from %s:%s.' % addr) s.sendto(b'Hello, %s!' % data, addr)
|
服务器端绑定好端口和地址后,调用recvfrom返回数据和对端地址
客户端 示例:
1 2 3 4 5 6 7 8 9
|
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for data in [b'Michael', b'Tracy', b'Sarah']: # 发送数据: s.sendto(data, ('127.0.0.1', 9999)) # 接收数据: print(s.recv(1024).decode('utf-8')) s.close()
|
客户端发送数据和接收数据和之前一样,仅仅是不需要调用connect连接服务器了。
谢谢关注我的公众号: