2023.12.28 网络编程

news/2024/11/9 5:06:16/

目录

bytes和str类型的互相转换

TCP服务端代码

TCP客户端代码

 一直运行服务器代码

一直运行客户端代码


网络编程三要素:ip地址,端口号,协议

端口号 0-65535 ,二的十六次方

TCP/IP协议

  • 传输数据之前要建立连接,通过三次握手建立:

    • 客户端 --> 服务端 ,SYN 客户端告诉服务端我是谁

    • 服务端 --> 客户端 , ACK + SYN

      • 服务端告诉客户端我收到了你的SYN(ACK)

      • 服务端告诉客户端我是谁 (SYN)

    • 客户端 --> 服务端 ,ACK

      • 服务端告诉客户端我收到了你的SYN ,同时确认你收到了我的SYN(ACK)

  • 开始传输数据 报文+内容

    • 报文类似元数据,描述数据从哪来、到哪去,数据大小、数据类型等

    • 内容:byteString类型,即bytes

bytes和str类型的互相转换

a = '哈萨克斯坦@#$%^&*(abc'
# str -> bytes类型(byte String)
# 按照utf8的格式,将str转为byteString类型
a_bytes = a.encode() # 默认utf8
print(a_bytes)# bytes类型 -> str
a = a_bytes.decode() # 默认utf8
print(a)""" b'\xe5' 
bytes 字节类型字符串 只是为了方便网络通讯 16进制数字来表述符号
【b】 表示bytes
【\xe5】 表示后边两个字符是16进制数字
"""# 按照gbk的格式,将str转为byteString类型
b_bytes = a.encode('gbk')
print(b_bytes)
b = b_bytes.decode('gbk') # bytes类型 -> str
print(b)# bytes数据一定可以转换为字符串吗???不一定(比如:图片、视频、音频等)

TCP服务端代码

"""TCP 服务端"""
import socket# ① 创建一个服务端socket套接字,负责接收客户端的请求(门迎)
# socket.AF_INET:使用IPV4的地址
# socket.SOCK_STREAM:使用TCP协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ② 绑定服务端的ip地址和端口号
# ('ip地址', 端口号)
# server_socket.bind(('127.0.0.1', 8080))
server_socket.bind(('192.168.25.76', 8080))# ③ 设置服务端进入监听状态
# 服务端同一时间支持多少个客户端向它发起连接请求
server_socket.listen(128)# ④ 服务端等待客户端进行连接
print('服务端等待接收客户端的请求...')# 没有客户端来连接服务端时,accept方法会阻塞等到,直到有客户端来连接,accept才会返回
# service_client_socket:也是一个 socket 对象,负责和对应的客户端进行通信(服务员)
# ip_port:是一个元祖,包含的是客户端的ip和port
service_client_socket, ip_port = server_socket.accept()
print(f'服务端来自{ip_port}客户端的连接...')# ⑤ 服务端接收客户端发送的数据
# 如果客户端没有给服务端发送消息,recv也会阻塞等待
recv_msg = service_client_socket.recv(1024) # bytes
print(f'接收到来自客户端的消息:{recv_msg.decode()}')# ⑥ 服务端给客户端回应数据
send_msg = input('请输入给客户端回应的消息:') # str
service_client_socket.send(send_msg.encode())# ⑦ 关闭服务端的 socket
service_client_socket.close()
server_socket.close()

TCP客户端代码

"""TCP客户端"""
import socket# ① 创建一个客户端的 socket 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ② 通过客户端 socket 连接服务端
client_socket.connect(('192.168.25.76', 8080))# ③ 发送消息给服务端
send_msg = input('请输入发送给服务端的消息:')
client_socket.send(send_msg.encode())# ④ 接收服务端回应的消息
recv_msg = client_socket.recv(1024) # bytes
print(f'接收到来自服务端的消息:{recv_msg.decode()}')# ⑤ 关闭客户端 socket
client_socket.close()

 一直运行服务器代码

import socket# 1-创建服务器端的socket套接字
# socket.AF_INET:IPv4
# socket.SOCK_STREAM:使用TCP协议
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2-绑定服务器的ip和端口号
server.bind(("127.0.0.1",9999))# 3-设置服务器的代码进入监听的状态
# server.listen(参数):参数用来表示同一时刻可以接收多少个客户端的请求
server.listen(10)# 4-服务端等待客户端发送请求过来
server_client,ip_port = server.accept()
print(server_client,type(server_client))
print(ip_port,type(ip_port))count = 0
while True:# 5-接收到客户端发送过来的请求# server_client.recv(参数):指定单次可以最大接收的信息的大小,单位是字节msg = server_client.recv(2000)decode_msg = msg.decode('UTF-8')print(decode_msg)# 6-发送信息返回给到客户端count += 1server_client.send(f'收到了,{count}'.encode('UTF-8'))# 7-关闭服务器的socket
# server_client.close()
# server.close()

一直运行客户端代码

import socket# 1-创建客户端的socket套接字
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2-通过客户端连接到具体的服务器
client.connect(('127.0.0.1',9999))while True:# 3-客户端给服务端发送信息msg = input('请输入要发送的内容')# 输入特殊内容,终止死循环if msg == 'close':breakclient.send(msg.encode('UTF-8'))# 4-接收服务端返回的响应msg = client.recv(2000)print(msg.decode('UTF-8'))# 5-关闭客户端的socket
client.close()


http://www.ppmy.cn/news/1287131.html

相关文章

【Google】关于Google Analytics埋点及API获取数据

本文是在实际操作中踩到的一些坑,并不是操作手册。具体的还是需要仔细按照官方文档操作。 参考文档:https://developers.google.com/analytics/ 重点看标红的文档即可 普通事件埋点 各端需要跟产品端确定好统一的事件名称和参数,否则数据混…

【MYSQL】MYSQL 的学习教程(七)之 慢 SQL 优化思路

1. 慢 SQL 优化思路 慢查询日志记录慢 SQLexplain 分析 SQL 的执行计划profile 分析执行耗时Optimizer Trace 分析详情确定问题并采用相应的措施 1. 慢查询日志记录慢 SQL 如何定位慢SQL呢? 我们可以通过 慢查询日志 来查看慢 SQL。 ①:开启慢查询日志…

AndroidR集成三方Native服务组件

一、背景 该项目为海外欧盟市场版本,需集成三方IDS安全组件,进程运行时注入iptables指令至链表,检测网络运行状态,并收集异常日志并压缩打包成gz文件,提供给Android上层应用上报云端。 二、分析 1、将提供的组件包集成至系统vendor分区 /vendor/bin/idsLogd/vendor/li…

【C#与Redis】--实践案例--案例 3:使用 Redis 实现排行榜

实现一个基本的排行榜系统通常涉及到对分数进行排序,而 Redis 的 Sorted Set 数据结构非常适合这种用途。以下是一个使用 StackExchange.Redis 库在 C# 中实现排行榜的简单案例: 安装 StackExchange.Redis 库: Install-Package StackExchan…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其诞…

ElasticSearch Nested类型全文检索、聚合查询

ElasticSearch Nested类型全文检索、聚合查询 Nested类型全文检索 创建索引 PUT /products1 {"mappings": {"properties": {"fulltext": {"type": "text"},"name": {"type": "text","…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案

2023 CCF 大数据与计算智能大赛 基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案 WELL 刘渝 人工智能 研一 西安交通大学 中国-西安 1461003622qq.com 史政立 网络空间安全 研一 西安交通大学 中国-西安 1170774291qq.com 崔琳、张…

python的pywebio库给孩子做加减法数学题

效果展示 程序执行后,打开浏览器,展示一些100以内的加减法混合运算的数学题并输入答案后判断对错,这样倒是省了买教材的钱了。 在题目下方的框中,输入答案,然后点击提交后, 会输出结果 pywebio库介绍 安装…