网络编程上

ops/2024/12/14 8:51:28/

二十二 网络编程上

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()

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) )

http://www.ppmy.cn/ops/141767.html

相关文章

GTF转为excel文件

1. 加载必需的 R 包 在处理基因组数据时,我们通常需要一些专门的 R 包来读取、操作和导出数据。以下是常用的包: library(rtracklayer) # 用于导入 GTF 文件数据 library(writexl) # 用于导出数据到 Excel 格式 (.xlsx) library(openxlsx) …

加速合并,音频与字幕的探讨

因上一节。合并时速度太慢了。显卡没用上。所以想快一点。1分钟的视频用了5分钟。 在合并视频时,进度条中的 now=None 通常表示当前处理的时间点没有被正确记录或显示。这可能是由于 moviepy 的内部实现细节或配置问题。为了加快视频合并速度并利用 GPU 加速,可以采取以下措…

NodeJS后端,用express实现Web防扫描(网站防扫描)

NodeJS后端,用express实现的Web服务器,通过记录访问频率和行为模式,识别潜在的恶意活动,从而实现Web服务器防扫描功能。 代码: const express require(express); const app express();// 用于存储IP地址及其请求历…

Spring Boot 实战:构建一个社交平台 API

在这篇博客中,我们将继续深入 Spring Boot 的开发实践,通过构建一个简单的社交平台 API,帮助大家理解如何使用 Spring Boot 高效地开发一个具有注册、登录、个人资料管理、帖子发布与评论、点赞等功能的社交平台。在开发过程中,我…

C语言程序设计P6-1【应用指针进行程序设计 | 第一节】——知识要点:指针的概念、定义和运算、指针变量作函数的参数

知识要点:指针的概念、定义和运算、指针变量作函数的参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 输入两个整数,按大小顺序输出,要求用函数处理,而且用指针类型的数据作函数参数…

怎样把音频中某个乐器分离?分离乐器音轨技术

在音乐的浩瀚宇宙中,每一种乐器都承载着独特的音色与情感,它们交织在一起,共同编织出动人的旋律。然而,有时候,我们可能希望从一首复杂的音乐作品中单独聆听某个乐器的演奏,以更深入地理解其旋律线条、和声…

360智脑张向征:共建可信可控AI生态 应对大模型安全挑战

发布 | 大力财经 人工智能的加速发展,有力推动了社会的数智化转型;与此同时,带来的相关安全风险也日益凸显。近日,在北京市举办的通明湖人工智能开发与应用大会上,360智脑总裁张向征以“大模型安全研究与实践”为主题&…

基于用户多元需求视角下 AI 智能名片 O2O 商城小程序的价值与发展策略

摘要:本文深入剖析在当今用户需求多元化的背景下,从显性与隐性需求层面探讨各类产品的发展趋势。以海飞丝等产品为例阐述传统产品功能与新兴多元需求的演变,进而引入 AI 智能名片 O2O 商城小程序,详细分析其如何契合用户多维度需求…