socket模块
描述
给我们提供了一个模拟控制OSI七层协议的方法,快让我们可以基于网络编写一个进行数据交互的程序
socket也叫套接字
基于文件类型的套接字家族(单机)
AF_UNIX
基于网络类型的套接字家族(联网)
AF_INET
代码简介
服务端
import socket
# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket() # 括号内不写参数 默认就是TCP协议 family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议即TCP
# 2.绑定一个固定的地址(服务端必备的条件)
server.bind(('127.0.0.1', 8080)) # 127.0.0.1为本地回环地址 只有自己的电脑可以访问
# 3.设立半连接池(暂且忽略)
server.listen(5)
# 4.等待接客
sock, addr = server.accept() # return sock, addr 三次握手
print(sock, addr) # sock就是双向通道 addr就是客户端地址
# 5.服务客人
data = sock.recv(1024) # 接收客户端发送过来的消息 1024字节
print(data.decode('utf8'))
# 给客户端发送消息 基于网络发送的消息必须是bytes类型
sock.send('尊敬的客人 您说什么就是什么 一切按照您的要求来'.encode('utf8'))
# 6.关闭双向通道
sock.close() # 四次挥手
# 7.关闭服务端
server.close() # 店倒闭了
客户端
import socket
# 1.生成socket对象指定类型和协议
client = socket.socket()
# 2.通过服务端的地址链接服务端
client.connect(('127.0.0.1', 8080))
# 3.直接给服务端发送消息
client.send('大爷有钱 把你们店最好的给我叫出来'.encode('utf8'))
# 4.接收服务端发送过来的消息
data = client.recv(1024)
print(data.decode('utf8'))
# 5.断开与服务端的链接
client.close()
代码优化
需求:
1.聊天内容自定义
2.让聊天循环起来
3.用户发送的消息不能为空
4.服务端多次重启可能会报错
5.客户端异常断开时如何让服务端继续服务其他客户端
服务端:
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
sock, addr = server.accept()
while True:
try:
data = sock.recv(1024)
print(f'收到来自{addr}的消息:', data.decode('utf8'))
msg = input('').strip()
sock.send(f'回复:{msg}'.encode('utf8'))
except BaseException:
break
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
while True:
msg = input('请输入您想要发送给服务端的消息>>>:').strip()
if len(msg) == 0:
print('不能发送空消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自于服务端发送过来的消息>>>:', data.decode('utf8'))
半连接池
server.listen(5)
当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题的情况下)
假设服务端只有一个人的情况下
在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可