如果希望我们的程序能够通过网络进行调用,就需用到网络编程的模块,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 * |
测试,看似没有什么问题,但是只能接受一个客户端的请求,可以使用多线/进程解决,这个后面再说
'', port=5000) # addr 传空字符串代表监听所有地址 serv = EchoSocketServer(addr= |
一个简单的客户端例子
客户端无非还是那几个方法,send
、recv
,只是要先通过 connect
方法连接服务端
from random import randint |
测试
'localhost', port=5000) client = EchoSocketClient(addr= |
实现并发
上面的 EchoSocketServer
同一时刻只能接受一个连接,这不科学,我们可以通过 Thread
来实现并发
from threading import Thread |
那就再写个多线程的客户端进行测试吧
from threading import Thread |
使用单进程 EchoServer
,多进程 EchoClient
'', port=5000) serv = EchoSocketServer(addr= |
使用多进程 EchoServer
, 多进程 EchoClient
结果看起来很科学
'', port=5000) serv = EchoThreadSocketServer(addr= |
socketserver
Python 标准库中有一个叫 socketserver
# python 2 为 SocketServer
的模块能让我们更简单的编写网络程序
更复杂的就不介绍了,请自行查阅 socketserver 官方文档,只介绍一点基础的使用,其实我也不会用,哈哈
fibserver
这次不写 echoserver 了,写计算 菲波那切数列的服务端程序,不要吐槽这个算法,这里使用递归来计算是为了降低响应效率,否则算的太快了。。。
import socketserver |
测试
'localhost', 5000), MyFibHandler) server = socketserver.TCPServer(( |
关于 socketserver
,我真的不知道更多东西了
参考资料:
David Beazley: Python Concurrency From the Ground Up: LIVE! 这个强烈推荐