python基于套接字的简单服务器和客户端的实现
关于C/S架构和套接字服务在这里就不赘述了,如有不明白的小伙伴请自行查询。
python提供了socket()函数,用于创建套接字对象用于套接字的网络通信。
要创建套接字,必须要实例化一个是socket()对象:
import socket server = socket.socket(socket_family,socket_type,protocol=0)
#其中socket_family指的是地址家族,一般比较受欢迎的平台都使用地址家族缩写AF,而一些比较旧的平台会使用协议家族PF。基于ipv4的家族名称为AF_INET,基于ipv6的家族名称为AF_INET6。
#socket_type指定了传输协议是什么,TCP套接字必须使用SOCK_STREAM,UDP必须使用SOCK_DGRAM。
#protocol通常省略,默认为0
socket对象创建好了,就可以使用套接字方法进行进一步的交互了(本文引用的是《Python核心编程第三版》)。
服务器套接字方法:
server.bind() 将地址(主机号,端口号)绑定到套接字上
server.listen() 设置并启动TCP监听器
server.accept() 被动接受TCP客户端的连接,一直等待直到连接到达
客户端的套接字方法:
server.connect() 主动发起TCP服务器连接
server.connect_ex() connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常
普通的套接字方法:
server.recv() 接收TCP消息
server.recv_into() 接收TCP消息到指定的缓冲区
server.send() 发送TCP消息
server.sendall() 完整的发送TCP消息
server.recvfrom() 接受UDP消息
server.recvfrom_into() 接收UDP消息到制定的缓冲区
server.sendto() 发送UDP消息
server.getpeername() 连接到套接字的远程地址
server.getsockname() 当前套接字地址
server.getsockopt() 返回给定套接字选项的值
server.setsockopt() 设置给定套接字选项的值
server.shutdown() 关闭连接
server.close() 关闭套接字
server.detach() 在未关闭文件描述符的情况下关闭套接字,返回文件描述
面向阻塞的套接字方法:
server.setblocking() 设置套接字的阻塞或非阻塞模式
server.settimeout() 设置阻塞套接字操作的超时时间
server.gettimeout() 获取阻塞套接字操作的超时时间
面向文件的套接字方法:
server.fileno() 套接字的文件描述符
server.makefile() 创建与套接字相关联的文件对象
一个TCP客户端的栗子:
import socket
host = ''
port = 9999
print "[*] Waiting for connection."
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((host,port)) #bind只有一个参数,不可以写成socket.bind(host,port)
server.listen(5)
while True:
tcpConn,addr = server.accept()
if tcpConn:
data = tcpConn.recv(1024)
print "[<]",data
message = raw_input('[>]')
tcpConn.send(message)
TCP客户端的栗子:
import socket
target_host = 'tcp服务器地址'
target_port = 9999
while True:
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client .connect((target_host,target_port))
data = raw_input('[>]')
if not data:
break
client.send("%s" %data)
message = client.recv(1024)
if not message:
break
print '[<]',data.strip()
client.close()