Socket APT 概览
python的socket模块提供了Berkeley socket API接口,这将会在我们这个教程里使用和讨论到
主要的用到的 Scoket API 函数和方法有下面这些:
` socket()
` bind()
` liste()
` accept()
` connect()
` connect_ex()
` send()
` recv()
` close()
Python 提供了和C 语言一致且方便的API
下面的就是服务器代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/4/15 0015 17:27
# @Author : Willpower-chen
# @Site :
# @File : Socket_server.py
# @Software: PyCharm
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.bind(( HOST , PORT ))
s.listen()
conn, addr = s.accept()
print(conn)
with conn:
print("连接于",addr)
while True:
data = conn.recv(1024)
print("客户端发",data)
if not data:
break
conn.sendall(data)
让我们来看一下API调用以及发生了什么
(1): socket.socket()创建了一个socket对象, 并且支持context manager type,你可以使用with语句,这样就可以不用再手动调用s.close()来关闭socket了
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
pass
(2): 调用socket()时传入的socket地址族参数 socket.AF_INET 表示因特网 IPv4 地址族,SOCK_STREAM表示使用了TCP的socket类型,协议将被用来在网络中传输消息
bind()方法用来关联socket 到指定的网络接口(IP 地址)和端口号:
HOST = '127.0.0.1'
PORT = 65432
#...
s.bind( (HOST,PORT) )
bind方法的入参取决于socket的地址族,在这个例子中我们使用了socket.AF_INET ( IPv4 ),它将返回两个元素的元组 (host,port)
host可以是主机名称,IP地址,空字符串,如果使用IP 地址, host就应该是IPv4 格式的字符串, 127.0.0.1 是标准的IPv4地址,端口号应该在1-65535之间的证书(0是保留的),这个证书就是用来接受客户端链接的TCP端口号, 如果端口号小于 1024, 有的操作系统会要求管理员权限
(3):继续看上面的服务器代码示例, listen() 方法调用使 服务器可以接受 连接请求,这使它成为一个[监听中] 的socket
s.listen()
conn, addr = s.accept()
listen() 方法有一个backlog 参数, 它指定在拒绝新的连接之前系统将允许使用的未接受的连接数量, 从 Python 3.5 开始, 这是可选参数. 如果不指定, python 将取一个默认值,如果你的服务器需要同时接受很多连接请求, 增加backlog 参数的值可以加大等待连接请求队列的长度, 最大长度取决于操作系统.
accept()方法阻塞并等待传入连接, 当一个客户端连接时, 它将返回一个新的 socket对象, 对象中有表示当前连接的conn 和一个由主机,端口号组成的IPv4/v6 连接的元组
这里必须明白我们通过调用 accept方法拥有了一个新的socket对象 , 这件事非常重要, 因为你将用这个socket对象和客户端进行通信, 和监听一个socket 不同的是后者只用来接受新的连接请求
conn, addr = s.accept()
with conn:
print("连接于",addr)
while True:
data = s.recv(1024)
print("客户端发",data)
if not data:
break
conn.sendall(data)
从accept 获取的客户端socket 连接的对象 conn, 使用一个无限 while 循环来阻塞调用 conn.recv() ,无论客户端传过来什么数据都会使用 conn.sendall()打印出来
如果conn.recv() 方法返回一个空的 byte 对象(b'')然后关闭客户端连接, 循环结束, with 语句 和conn 语句一起使用时,通信结束的时候会自动关闭 socket 连接.
这样就完成了服务端的配置.