请稍候,加载中....

socket模块

该模块提供了对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()

 


Python学习手册-