Python socket模块实现了服务器和客户端之间的通信,具体来说,是用socket()函数来创建一个套接字(个人理解相当于一种协议,如因特网地址是用主机名+端口号构成就是套接字的一种体现),而套接字又利用系列的方法实现了网络通信。套接字分为有连接的套接字和无连接的套接字。
Python支持的套接字有两种:一种是AF_UNIX,或则叫AF_LOCAL,基于文件系统的,如同一台机器上多个进程之间的通信,底层结构由文件系统来支持。另外一种套接字是AF_INET,基于网络型的,实现不同机器之间的通信。在Python2.5之后加入了AF_NETLINK,用于支持Linux套接字。
创建socket服务器
- from socket import socket,AF_INET,SOCK_STREAM
- from time import ctime
- HOST = '' #HOST为空,绑定所有有效的地址,即可以接收所有客户端的请求
- PORT = 21567 #端口号
- BUFSIZE = 1024 #缓冲区的大小
- ADDRESS = (HOST,PORT)
- tcpSerSock = socket(AF_INET,SOCK_STREAM)
- #--------------------------------------#
- #用socket(socket_family,socket_type,protocol=0)创建套接字
- #socket_family为AF_UNIX或AF_INET
- #AF_UNIX:基于文件系统
- #AF_INET:基于网络系统
- #socket_type为SOCK_STREAM或SOCK_DGRAM
- #SOCK_STREAM:面向连接(TCP),以数据流方式传输数据
- # 有序、可靠的、不会重复传输
- #SOCK_DGRAM:面向无连接,以数据包方式传输
- # 不可靠,无序,性能更高
- #protocol默认值为0
- #-------------------------------------#
- tcpSerSock.bind(ADDRESS) #绑定IP地址到套接字
- tcpSerSock.listen(5) #监听连接,参数表示允许同时连接的最大数
- while True:
- print 'waiting for connection...'
- tcpClisock,addr = tcpSerSock.accept();
- #accept()返回socket请求对象和客户端地址
- print '...connected from:',addr
- while True:
- data = tcpClisock.recv(BUFSIZE)
- #接收客户端发送的数据
- if not data:
- break
- print data
- responseinfo = raw_input('>')
- tcpClisock.send('[%s] %s' %(ctime(),responseinfo))
- #响应请求
- tcpClisock.close()
- tcpSerSock.close()
创建socket客户端
- from socket import socket,AF_INET,SOCK_STREAM
- HOST = '127.0.0.1' #指定服务器地址
- PORT = 21567
- BUFSIZE = 1024
- ADDRESS = (HOST,PORT) #PORT,BUFSIZE参数和服务器相同
- tcpCliSock = socket(AF_INET,SOCK_STREAM)
- #和服务器端保持一致
- tcpCliSock.connect(ADDRESS) #连接服务器
- while True:
- data = raw_input('>')
- if not data:
- break
- tcpCliSock.send(data)
- data = tcpCliSock.recv(BUFSIZE)
- #接收服务器响应消息
- if not data:
- break
- print data
- tcpCliSock.close()
启动两个命令行窗口分别运行服务器和客户端程序,效果入下:
服务器:
客户端: