二十二 网络编程上
22.1 socket套接字
import socket # 网络编程模块,套接字# 1.创建一个socket对象 socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET)
# 需要传递2个参数第1个参数socket.AF_INET : ipv4第2个参数socket.SOCK_STREAM TCP协议(流式协议)socket.SOCK_DGRAM UDP协议(数据报协议)# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1',8000))# sock.bind(('ip',端口))
# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')
# 4.取出请求
conn,addr = sock.accept() # 会返回一个元组,元组有2个值 三次握手
print('和客户端的连接对象:',conn)
print('客户端的信息',addr)
client.py
import socket# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口
注意
recv -->接收数据--> decode解码
send -->发送数据--> encode编码
2对特殊的关系 (阻塞)
- 服务端
- conn,addr = sock.accept() # 阻塞 等待客户端连接
- 客户端:sock.connect()
- recv(1024) # 阻塞 等待客户端发送数据
- 客户端:sock.send()
- conn,addr = sock.accept() # 阻塞 等待客户端连接
22.2 循环通信
server.py
import socket # 网络编程模块,套接字# 1.创建一个socket对象 socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')# 4.取出请求
conn, addr = sock.accept() # 会返回一个元组,元组有2个值 三次握手
print('连接成功,客户端的信息', addr)
# 通信循环
while True:# 接收数据cai = conn.recv(1024).decode('utf-8')if cai == '':breakprint(f"客户端发来的数据:{cai}")if cai == '鸦片':conn.send('不贩毒,我要报警'.encode('utf-8'))else:conn.send("成功收到您的订单,稍后送达".encode('utf-8'))
conn.close() # 断开与客户端的连接
client.py
import socket# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口while True:# 发送数据cai = input("请点菜(q/Q退出):").strip() # 清空前后空白if cai.upper() == 'Q':breaksock.send(cai.encode('utf-8'))res = sock.recv(1024).decode('utf-8')print(res)
22.3 发空问题
客户端故意发送空字符串
server.py
import socket # 网络编程模块,套接字# 1.创建一个socket对象 socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')# 4.取出请求
conn, addr = sock.accept() # 会返回一个元组,元组有2个值 三次握手
print('连接成功,客户端的信息', addr)
# 通信循环
while True:# 接收数据cai = conn.recv(1024).decode('utf-8')if cai == '':# 客户端断开了breakprint(f"客户端发来的数据:{cai}")if cai == '鸦片':conn.send('不贩毒,我要报警'.encode('utf-8'))else:conn.send("成功收到您的订单,稍后送达".encode('utf-8'))
conn.close() # 断开与客户端的连接
client.py
import socket# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口while True:# 发送数据cai = input("请点菜(q/Q退出):").strip() # 清空前后空白if cai == '':print('请重新输入')continueif cai=='q' or cai=='Q':breaksock.send(cai.encode('utf-8'))res = sock.recv(1024).decode('utf-8')print(res)
22.4 服务后再服务
server.py
import socket # 网络编程模块,套接字# 1.创建一个socket对象 socket.socket() 返回一个对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.服务端绑定自己的IP地址
sock.bind(('127.0.0.1', 8000))# 3.开始监听连接请求(开始等待客户上门)
sock.listen(5)
print('服务端启动成功,在8000端口等待客户端连接')while True:# 4.取出请求conn, addr = sock.accept() # 会返回一个元组,元组有2个值 三次握手print('连接成功,客户端的信息', addr)# 通信循环while True:# 接收数据cai = conn.recv(1024).decode('utf-8')if cai == '':# 客户端断开了breakprint(f"客户端发来的数据:{cai}")if cai == '鸦片':conn.send('不贩毒,我要报警'.encode('utf-8'))else:conn.send(f"成功收到您的订单[{cai}],稍后送达".encode('utf-8'))conn.close() # 断开与客户端的连接print(addr[1],'已退出')
client.py
import socket# 1.创建一个socket对象
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2.连接服务端,需要填充服务端的ip和端口
sock.connect(('127.0.0.1',8000)) # 指定服务端的地址和端口while True:# 发送数据cai = input("请点菜(q/Q退出):").strip() # 清空前后空白if cai == '':print('请重新输入')continueif cai=='q' or cai=='Q':breaksock.send(cai.encode('utf-8'))res = sock.recv(1024).decode('utf-8')print(res)
sock.close()
22.5 udp
2个区别1.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2.接收 recvfrom发送 sendto
server.py
import socket# 1.创建socket对象 UDP协议:socket.SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2.绑定地址
sock.bind(('127.0.0.1',8080))# 接收一个元组 (数据,对方的地址+端口)
data,addr = sock.recvfrom(1024)
print(data.decode('utf-8'))
print(addr)
client.py
import socket# 1.创建socket对象 UDP协议:socket.SOCK_DGRAM
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)cai = input('请输入一个菜:')# 发送数据, 2个参数
# 1.数据 (编码)
# 2. 对方的地址和端口号sock.sendto(cai.encode(), ('127.0.0.1',8080) )