如果希望我们的程序能够通过网络进行调用,就需用到网络编程的模块,Python 最基础的网络程序就是 通过 socket 来编写,高级一点的就是所谓的 Web 编程了,底层无非也就是 socket 通信,本文主要介绍 socket 这个模块的用法
socket 基础用法
和 threading 一样,Python 中 socket 是对 _socket 的封装,_socket 更为底层,我们一般使用 socket
为了方便,我们导入 socket 模块中的所有类
from socket import * |
socket 接受几个参数
- family : 传输使用的地址族,常用的是
AF_INET、AF_INET6、AF_UNIX - type : 传输使用的协议,常用的是
SOCK_STREAM/TCP、SOCK_DGRAM/UDP - proto: 通常为 0,如果 family 为
AF_CAN时,应该为CAN_RAW或CAN_BCM - fileno: 通常为
None,如果指定了,则会返回一个具有指定文件描述符的套接字返回 # 其实我也不知道什么意思,但是并不妨碍我们写代码
""" |
然后程序会阻塞,我们通过 nc 命令建立连接
nc localhost 5000 |
中断并输出
# output |
一个简单的服务端例子
这个简单的例子,会将客户端发送的信息原样返回,能够大致的了解 socket 服务端是怎么做的
from socket import * |
测试,看似没有什么问题,但是只能接受一个客户端的请求,可以使用多线/进程解决,这个后面再说
serv = EchoSocketServer(addr='', port=5000) # addr 传空字符串代表监听所有地址 |
一个简单的客户端例子
客户端无非还是那几个方法,send、recv ,只是要先通过 connect 方法连接服务端
from random import randint |
测试
client = EchoSocketClient(addr='localhost', port=5000) |
实现并发
上面的 EchoSocketServer 同一时刻只能接受一个连接,这不科学,我们可以通过 Thread 来实现并发
from threading import Thread |
那就再写个多线程的客户端进行测试吧
from threading import Thread |
使用单进程 EchoServer ,多进程 EchoClient
serv = EchoSocketServer(addr='', port=5000) |
使用多进程 EchoServer, 多进程 EchoClient
结果看起来很科学
serv = EchoThreadSocketServer(addr='', port=5000) |
socketserver
Python 标准库中有一个叫 socketserver # python 2 为 SocketServer 的模块能让我们更简单的编写网络程序
更复杂的就不介绍了,请自行查阅 socketserver 官方文档,只介绍一点基础的使用,其实我也不会用,哈哈
fibserver
这次不写 echoserver 了,写计算 菲波那切数列的服务端程序,不要吐槽这个算法,这里使用递归来计算是为了降低响应效率,否则算的太快了。。。
import socketserver |
测试
server = socketserver.TCPServer(('localhost', 5000), MyFibHandler) |
关于 socketserver,我真的不知道更多东西了
参考资料:
David Beazley: Python Concurrency From the Ground Up: LIVE! 这个强烈推荐