1.套接字
两个端点的程序之间的“信息通道”。程序可能分布在不同的计算机上(通过网络连接),通过套接字相互发送信息。
套接字包括两个:服务器套接字和客户机套接字。在创建一个服务器套接字后,让它等待连接。这样它就在某个网络地址处(IP地址和一个端口的组合)监听,直到有客户端套接字连接。连接完成后两者就可以进行交互了。
2.socket模块(套接字)
服务器端的通信过程和客服端通信过程:
socket => blind => listen => accpect => send =>secv => close
服务器端套接字函数:
s.bind() 绑定地址(主机,端口号对)到套接字
s.listen() 开始 TCP 监听
s.accept() 被动接受 TCP 客户的连接,(阻塞式)等待连接的到来
客户端套接字函数:
s.connect() 主动初始化 TCP 服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回
出错码,而不是抛异常
公共用途的套接字函数:
s.recv() 接收 TCP 数据
s.send() 发送 TCP 数据
s.sendall() 完整发送 TCP 数据
s.recvfrom() 接收 UDP 数据
s.sendto() 发送 UDP 数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
3.socket()模块函数
socket()模块函数语法如下:
socket(socket_famliy,socket_type,protocol=0)
socket_family 可以是 AF_UNIX 或 AF_INET。socket_type可以是 SOCK_STREAM 或SOCK_DGRAM。protocol 一般不填,默认值为 0。
套接字地址:主机与端口
合法的端口号范围为 0 到 65535。其中,小于 1024 的端口号为系统保留端口。在 Unix 操作系统,保留的端口号(及其对应的服务/协议和套接字类型)可以通过/etc/services文件获得。
常用端口号列表可以从下面这个网站获得:
http://www.iana.org/assignments/port-numbers
4.socket()模块函数 --创建套接字
创建一个 TCP/IP 的套接字,调用 socket.socket():
tcpSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建TCP套接字时类型只能是SOCK_STREAM。
创建一个 UDP/IP 的套接字:
udpSocket=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)
创建UDP套接字是类型只能是SOCK_DGRAM。
5.创建一个 TCP 服务器:
创建一个通用的 TCP 服务器的伪代码:
ss = socket() # 创建服务器套接字
ss.bind() # 把地址绑定到套接字上
ss.listen() # 监听连接
inf_loop: # 服务器无限循环
cs = ss.accept() # 接受客户的连接
comm_loop: # 通讯循环
cs.recv()/cs.send() # 对话(接收与发送)
cs.close() # 关闭客户套接字
ss.close() # 关闭服务器套接字(可选)
TCP 时间戳服务器:
创建一个 TCP 服务器程序,这个程序会把客户发送过来的字符串加上一个时间戳(格式:'[时间]数据')返回给客户。
创建一个通用的 TCP 客户端的伪代码:
cs = socket() # 创建客户套接字
cs.connect() # 尝试连接服务器
comm_loop: # 通讯循环
cs.send()/cs.recv() # 对话(发送/接收
cs.close() # 关闭客户套接字
创建一个 UDP 服务器:
由于 UDP 服务器不是面向连接的,所以直接等待进来的连接就好了。创建一个能接收客户的消息,在消息前加一个时间戳后返回的 UDP 服务器。伪代码:
ss = socket() # 创建一个服务器套接字
ss.bind() # 绑定服务器套接字
inf_loop: # 服务器无限循环
cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
ss.close() # 关闭服务器套接字
UDP 客户端伪代码如下:
cs = socket() # 创建客户套接字
comm_loop: # 通讯循环
cs.sendto()/cs.recvfrom() # 对话(发送/接收)
cs.close() # 关闭客户套接字
网友评论