网络编程上
二十二 网络编程上
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 == '':
break
print(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':
break
sock.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 == '':
# 客户端断开了
break
print(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('请重新输入')
continue
if cai=='q' or cai=='Q':
break
sock.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 == '':
# 客户端断开了
break
print(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('请重新输入')
continue
if cai=='q' or cai=='Q':
break
sock.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) )
原文地址:https://blog.csdn.net/2301_80202670/article/details/144372882
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!