2.基本语法
客户端 import socket # 1.创建socket对象 client = socket.socket() # 2.链接服务器 client.connect((ip,port)) # 3.收发数据 通常需要循环 client.send(二进制数据) # 只能发二进制数据 client.recv(字节数) # 收多少字节数 阻塞直到接收到数据 # 4.断开链接 client.close() 服务端 # 1.创建socket对象 server = socket.socket() # 2.绑定一个固定的ip和端口 server.bind(ip,port)) # 3.开始监听客户端的到来 server.listen() # 可不填 # 4.接收客户端的链接请求 conn,addr = server.accept() # 阻塞直到客户链接到来 没有新连接则不可能执行该函数 # 5.收发数据 通常需要循环 conn.send(二进制数据) # 只能发二进制数据 conn.recv(字节数) # 收多少字节数 阻塞直到接收到数据 # 6.关闭双行通道和服务器 conn.close() server.close() 复制代码
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
3.循环连接和循环通信
客户端 import socket client = socket.socket() client.connect((‘127.0.0.1‘,8080)) while True: msg = input(‘>>>:‘).encode(‘utf-8‘) if len(msg) == 0:continue client.send(msg) data = client.recv(1024) print(data) 服务端 import socket """ 服务端 固定的ip和port 24小时不间断提供服务 """ server = socket.socket() # 生成一个对象 server.bind((‘127.0.0.1‘,8080)) # 绑定ip和port server.listen(5) # 半连接池 while True: conn, addr = server.accept() # 等到别人来 conn就类似于是双向通道 print(addr) # (‘127.0.0.1‘, 51323) 客户端的地址 while True: try: data = conn.recv(1024) print(data) # b‘‘ 针对mac与linux 客户端异常退出之后 服务端不会报错 只会一直收b‘‘ if len(data) == 0:break conn.send(data.upper()) except ConnectionResetError as e: print(e) break conn.close()
原文:https://www.cnblogs.com/tfzz/p/11317612.html