一 socket(套接字)
1.什么是socket:Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,了socket以后,无需自己编写代码实现三次握手,四次挥手,ARP请求,打包数据等等,socket已经封装好了,只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
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
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!