4.20笔记
正课
socket
计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据
套接字家族的名字:AF_INET
套接字 例
以打电话为例,分为服务端和客户端
# 服务端
import socket
# 1. 买手机:得到一个实例化对象
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2. 绑定手机卡
phone.bind(('127.0.0.1',8000)) # 元组形式放ip+端口
# 3. 开机
phone.listen(5) # backlog=5 半连接池的大小
# 4. 等待电话连接请求
conn,client_addr = phone.accept()
print(conn)
print('客户端的ip和端口:',client_addr)
# 5. 接收消息,发消息
data=conn.recv(1024) # 最多接收数据1024bytes,bytes类型
# 客户端 服务端一次接收的数据有限,这个数值增大没有意义
conn.send(data.upper())
# 对接收的数据进行处理
# 6. 关闭电话连接conn
conn.close()
# 7. 可选操作:关机
phone.close
# 客户端
import socket
#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
#2、拨通服务端电话
phone.connect(('127.0.0.1',8080))
#3、通信
import time
time.sleep(2)
phone.send('歪比歪比'.encode('utf-8'))
data=phone.recv(1024)
print(data.decode('utf-8'))
#4、关闭连接(必选的回收资源的操作)
phone.close()
收发实际上是在跟自己的缓存打交道,向网卡要数据,不是一次send对应一次recv
处理bug
-
客户端输入空消息的时候continue
-
服务端在接收发送的时候客户端可能会被关闭:加入try except异常处理
-
把整个accept放进while 循环,一个客户端断开以后,close之后再建立一个新的连接,再接收别的客户端的数据
以后会用并发代替,不会用
# 客户端
import socket
phone = socket.socket(-1,-1)
phone.connect(('127.0.0.1',8000))
while True:
cmd = input('需要执行的指令:')
if not cmd:
continue
if cmd == 'q':
break
phone.send(cmd.encode('utf-8'))
data = phone.recv(1024)
print(data.decode('utf-8'))
phone.close()
# 服务端
import socket
phone = socket.socket(-1,-1)
phone.bind(('127.0.0.1',8000))
phone.listen(5)
print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8000))
while True:
conn, client_addr = phone.accept()
print(client_addr)
while True:
try:
data = conn.recv(1024)
if len(data)==0:
break
print('接收到的数据:',data.decode('utf-8'))
conn.send(f'{data}歪比巴布'.encode('utf-8'))
except Exception as e:
print(e)
print('连接断开')
break
conn.close()
udp
# 客户端
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg=input('>>: ').strip()
if not msg:continue
udp_server_client.sendto(msg.encode('utf-8'),ip_port)
back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
print(back_msg.decode('utf-8'),addr)
# 服务端
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server_client.bind(ip_port)
while True:
msg,addr=udp_server_client.recvfrom(BUFSIZE)
print(msg,addr)
udp_server_client.sendto(msg.upper(),addr)