Python Socket与Linux Socket
socket: Python的底层网络接口,一般情况程序员不需要接触到这个模块。有更多的高级模块,比如requests可以直接使用。本文章试图从Python的socket模块和linux socket api的角度来对Python实现网络通讯方式进行分析,提高对TCP,UDP通讯方式的理解。最后用Python实现一个hello/hi的简单的网络聊天程序。
1. socket
在Python中如果想要使用一个自己的网络应用层协议,或者说想使用纯原生TCP,UDP来实现通讯,就需要使用Python的socket模块。
import socket
socket模块提供了访问BSD套接字的接口。在所有现代Unix系统、Windows、macOS和其他一些平台上可用。
1.1 socket()方法
# 使用socket()方法返回一个socket对象
s = socket.socket([family[, type, proto, fileno]])
重要参数:
family: 套接字家族,如ipv4,ipv6,unix系统进程间通信
type: 套接字类型,如tcp,upd
参数
描述
family
socket.AF_INET(默认)
IPv4
socket.AF_INET6
IPv6
socket.AF_UNIX
Unix系统进程间通信
type
socket.SOCK_STREAM
流式套接字,TCP
socket.SOCK_DGRAM
数据报套接字,UDP
socket.SOCK_RAW
原始套接字
socket方法与Linux Socket的socket函数对应
// socket(协议域,套接字类型,协议)
int socket(int domain, int type, int protocol);
通过s = socket.socket()方法,得到了一个socket对象。
Python中的socket对象的成员方法,是对套接字系统调用的高级实现,往往比C语言更高级。
2. TCP
2.1 bind()方法
通常如果是服务器,需要绑定一个总所周知的地址用于提供服务,所以需要绑定一个(IP:PORT),客户端可以通过连接这个地址来获得服务。而客户端则直接通过连接,由系统随机分配一个端口号。
python中bind()方法传入一个地址和端口的元组
s.bind((host: str, port: int))