python中涉及到两种套接字分别为AF_UNIX基于文件的和AF_INET基于网络的,为支持ipv6还引入了AF_INET6,python2.5后引入了AF_NETLINK无连接。套接字读端口的使用范围是0- 5535,小于1024的端口默认为系统服务保留,linux、unix系统/etc/service文件中有对默认端口对应服务的映射表。
文件部分内容如下:
socket可以分为面向连接的和无连接的,面向连接的又称为流套接字,面向连接的套接字使用tcp协议,套接字类型为SOCK_STREAM,面向无连接的套接字,使用数据包形式进行通信,使用udp协议,套接字类型为SOCK_DGRAM。
PYTHON中实现网络编程主要使用socket模块,模块中socket用来创建套接字,套接字使用自己的函数提供基于套接字的网络通信。
socket()模块函数:
socket函数创建套接字语法如下:
socket(socket_family,socket_type,protocol=0)
socket_family:不是AF_VNIX就是AV_INET
socket_type:可以是SOCK_STREAM流方式,也可以是SOCK_DGRAM
PROTOCOL:一般不用填
套接字的内建方法较多主要分为3类服务端用的套接字函数、客户端用的套接字函数、公共用途的套接字函数。
服务端使用的套接字函数如下:
s.bind() 绑定地址(主机名、端口号)到套接字
s.listen() 开始监听
s.accept() 被动接收客户端
客户端套接字函数如下:
s.connect() 主动初始化tcp服务连接
s.connect_ex() connect函数的扩展版本,出错误时返回错误码,不返回异常消息
公共用途的套接字函数主要如下:
s.recv() 接受tcp数据
s.send() 发送tcp数据
s.sendall() 完整发送tcp数据
s.recvfrom() 接受udp数据。
s.sendto() 发送udp数据
s.getpeername() 连接到当前套接字的远端的地址(tcp连接)
s.getsockname() 当前套接字地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字参数
s.close() 关闭套接字
面向模块的套接字函数如下:
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置套接字超时时间
s.gettimeout() 获取套接字超时时间
面向文件的套接字函数如下:
s.fileno() 套接字文件描述
s.makefile() 创建一个与套接字关联的文件对象
创建一个tcp服务器伪代码如图:
服务端示例代码如下:
''' #!/usr/bin/env python
from socket import *
from time import ctime
HOST=''
PORT=21567
BUFSIZE=1024
ADDR=(HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print 'waiting for connectiong....'
tcpCliSock, addr = tcpSerSock.accept()
print '...connected from:', addr
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
tcpCliSock.send('[%s] %s' %s (ctime(), data))
tcpCliSock.close()
tcpSerSock.close() '''
代码运行后开启端口监听,等待客户端连接,如下图:
创建一个客户端代码连接服务端,代码如下:
#!/usr/bin/env python
from socket import *
HOST='127.0.0.1'
PORT=21567
BUFSIZE=1024
ADDR=(HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input('please input >')
if not data:
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print data
tcpCliSock.close()
运行效果如图: