该模块提供了对BSD的套接字访问,可以在Windows, MacOS, 类UNIX等平台上使用
导入socket模块
from socket import *
socket对象
创建一个面向网络的tcp连接socket对象
s = socket(AF_INET, SOCK_STREAM)
socket对象属性
属性名 | 说明 |
family | 套接字家族名 |
type | 套接字类型 |
proto | 套接字协议 |
socket对象方法
方法名 | 说明 |
bind(address) | 面向网络连接中,address是一个由(host,port)组成的元组,将地址绑定到socket上 |
listen([backlog]) | 启动tcp监听,backlog指定允许的最多连接数,连接数超过此数后,将拒绝新的连接,如果省略,将由系统决定一个合理的连接数。 |
accept() | 等待连接,在有连接到达前保持阻塞,一旦连接到来,返回一个由(socket object, address info)组成的客户端信息元组 |
connect(address) | 客户端向服务端请求连接,address是由服务端的address信息,客户端连接之前,应该已经知晓服务器的address |
connect_ex(address) | 同connect,但是发生错误不会抛出异常,而是返回错误code |
recv(buffersize[,flags]) | 接收数据,如果指定了buffersize,那么最多接受buffersize bytes。如果没有数据,会阻塞到至少有一个字节到达或者连接关闭。如果远端连接关闭,并且读取了所有数据,返回一个空字符串。 |
recv_into(buffer,[nbytes[,flags]]) |
接受数据到缓冲区 |
send(data[,flags]) | 发送数据 |
sendall(data[,flags]) | 调用send,直到所有的数据发送完毕 |
recvfrom(buffersize[,flags]) | 接受udp消息,除了返回接收到的数据以外,还会返回远端的address信息 |
recvfrom_into(buffer,[nbytes[,flags]]) | 接受udp消息,放到缓冲区 |
sendto(data[,flags], address) | 向address发送udp消息 |
getpeername() | 返回远程的地址address信息 |
getsockname() | 返回本地的地址address信息 |
shutdown(flag) | flag=SHUT_RD 关闭read连接 flag=SHUT_WR 关闭write连接 flag=SHUT_RDWR 关闭全部连接 |
close() | 关闭套接字 |
setblocking(flag) | flag=True 阻塞 flag=Flase 非阻塞 |
settimeout(timeout) | timeout=None 相当于 setblocking(True) timeout=0 相当于setblocking(False) |
gettimeout() | 获取阻塞套接字超时时间 |
tcp服务端代码示例
from socket import *
address = ("127.0.0.1", 5000)
s = socket(AF_INET, SOCK_STREAM)
s.bind(address)
s.listen(3)
buffersize = 1024
try:
while True:
print("等待客户连接......")
c_sock, c_addr = s.accept()
print("来自",c_addr, "的连接")
while True:
data = c_sock.recv(buffersize)
if not data:
break
print("来自客户端的数据",data)
c_sock.send(b"ok"+data)
c_sock.close()
finally:
s.close()
tcp客户端代码示例
from socket import *
client_s = socket(AF_INET, SOCK_STREAM)
client_s.connect(("127.0.0.1", 5000))
while True:
data = input()
if not data:
break
client_s.send(data.encode("utf-8"))
data = client_s.recv(1024)
print("来自服务器的响应:",data)
client_s.close()
服务器会将客户端发送来的数据加上ok前缀返回
UDP服务端代码示例
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("127.0.0.1", 5000))
while True:
print("等待消息中......")
data, addr = s.recvfrom(1024)
print("接收到客户端数据:", data.decode("utf-8"))
s.sendto(b'ok'+data, addr)
s.close()
UDP客户端代码示例
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
while True:
data = input(">_")
if not data:
break
s.sendto(data.encode(),("127.0.0.1", 5000))
data, addr = s.recvfrom(1024)
print("来自",addr,"的数据:", data.decode("utf-8"))
s.close()
讨论区