Python-Socket网络编程简单示例

#  === TCP 服务端程序 server.py ===# 导入socket 库
from socket import *# 主机地址为空字符串,表示绑定本机所有网络接口ip地址
# 等待客户端来连接
IP = ''
# 端口号
PORT = 50000
# 定义一次从socket缓冲区最多读入512个字节数据
BUFLEN = 512# 实例化一个socket对象
# 参数 AF_INET 表示该socket网络层使用IP协议
# 参数 SOCK_STREAM 表示该socket传输层使用TCP协议
listenSocket = socket(AF_INET, SOCK_STREAM)# socket绑定地址和端口
listenSocket.bind((IP, PORT))# 使socket处于监听状态,等待客户端的连接请求
# 参数 8 表示 最多接受多少个等待连接的客户端
listenSocket.listen(8)
print(f'服务端启动成功,在{PORT}端口等待客户端连接...')dataSocket, addr = listenSocket.accept()
print('接受一个客户端连接:', addr)while True:# 尝试读取对方发送的消息# BUFLEN 指定从接收缓冲里最多读取多少字节recved = dataSocket.recv(BUFLEN)# 如果返回空bytes,表示对方关闭了连接# 退出循环,结束消息收发if not recved:break# 读取的字节数据是bytes类型,需要解码为字符串,其他格式其他处理info = recved.decode()print(f'收到对方信息: {info}')# 发送的数据类型必须是bytes,所以要编码dataSocket.send(f'服务端接收到了信息 {info}'.encode())# 服务端也调用close()关闭socket
dataSocket.close()
listenSocket.close()#  === TCP 客户端程序 client.py ===from socket import *IP = '127.0.0.1'
SERVER_PORT = 50000
BUFLEN = 1024# 实例化一个socket对象,指明协议
dataSocket = socket(AF_INET, SOCK_STREAM)# 连接服务端socket
dataSocket.connect((IP, SERVER_PORT))while True:# 从终端读入用户输入的字符串toSend = input('>>> ')if toSend == 'exit':break# 发送消息,也要编码为 bytesdataSocket.send(toSend.encode())# 等待接收服务端的消息recved = dataSocket.recv(BUFLEN)# 如果返回空bytes,表示对方关闭了连接if not recved:break# 打印读取的信息print(recved.decode())dataSocket.close()

#  === TCP 服务端程序 server.py 异步支持多客户端 ===
import asyncio, socket
IP = ''
PORT = 50000
BUFLEN = 512# 定义处理数据收发的回调
async def handle_echo(reader, writer):addr = writer.get_extra_info('peername')while True:data = await reader.read(100)if not data:print(f'客户端{addr}关闭了连接')writer.close()breakmessage = data.decode()print(f'收到{addr}信息: {message}')writer.write(data)loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, IP, PORT, loop=loop)
server = loop.run_until_complete(coro)# Serve requests until Ctrl+C is pressed
print('服务端启动成功,在{}端口等待客户端连接...'.format(server.sockets[0].getsockname()[1]))
try:loop.run_forever()
except KeyboardInterrupt:pass# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
#  === UDP 服务端程序 server.py ===import socket,jsonBUFF_LEN = 400    # 最大报文长度
ADDR     = ("", 18000)  # 指明服务端地址,IP地址为空表示本机所有IP# 创建 UDP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
server_socket.bind(ADDR)while True:try:recvbytes, client_addr = server_socket.recvfrom(BUFF_LEN)except socket.timeout:continueprint(f'来自 {client_addr} 的请求')# 接收到的信息是字节,所以要解码,再反序列化message = json.loads(recvbytes.decode('utf8'))print(message)if message['action'] == '获取信息':# 可以从数据库的数据源查询 此用户的信息username = message['name']# 要发送的信息 对象message = {'action' : '返回信息','info' : f'{username} 的信息是:xxxxxxxx'} # 发送出去的信息必须是字节,所以要先序列化,再编码sendbytes = json.dumps(message).encode('utf8')server_socket.sendto(sendbytes, client_addr)server_socket.close()#  === UDP 客户端程序 client.py ===import socket,jsonBUFF_LEN     = 400                   # 最大报文长度
SERVER_ADDR  = ("127.0.0.1", 18000)  # 指明服务端地址# 创建 UDP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置socket超时时间,单位:秒
client_socket.settimeout(2)# 要发送的信息 对象
message = {'action' : '获取信息','name' : 'test2'
} 
# 发送出去的信息必须是字节,所以要先序列化,再编码
sendbytes = json.dumps(message).encode('utf8')
client_socket.sendto(sendbytes, SERVER_ADDR)
try:recvbytes, server = client_socket.recvfrom(BUFF_LEN)# 接收到的信息是字节,所以要解码,再反序列化message = json.loads(recvbytes.decode('utf8'))print(message)
except socket.timeout:print('接收消息超时')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第1讲:创建vite工程,使用框架为Vanilla时,语言是typescript,修改http端口的方法

直接在项目根目录创建 vite.config.ts文件。 在该文件中添加内容: import { defineConfig } from vite;export default defineConfig({server: {port: 7777,}, });最后尝试运行package.json中的Debug

【C语言】15.sizeof 和strlen

一、sizeof 和strlen 比较 sizeofstrlen1. sizeof是操作符1. strlen是库函数,使用需要包含头⽂件 string.h2. sizeof计算操作数所占内存的大小,单位是字节2. srtlen是求字符串长度的,统计的是 \0 之前字符的隔个数3. 不关注内存中存放什么数…

AI大模型的TTS评测

L-MTL(Large Multi-Task Learning)Models 是一种大规模多任务学习模型,通过结合 Mixture of Experts(MMoE)框架与 Transformer 模型,实现对 TTS(Text-to-Speech)系统中多个评估指标的…

Selenium 操作指南:鼠标点击和键盘输入高级技巧

在自动化测试或网页操作中,精确地模拟鼠标点击和键盘输入是至关重要的。Selenium 提供了一个强大的工具——ActionChains 类,它允许用户以编程方式执行复杂的鼠标和键盘操作。本文将深入探讨如何利用 Selenium 的 ActionChains 类来执行鼠标单击、双击、…

浅谈轨道电路分类

区间:移频轨道电路。 站内:工频交流连续式轨道电路、25Hz相敏轨道电路。 工频交流连续式轨道电路(480轨道电路):采用工频50Hz交流电源,以JZXC-480型继电器为轨道继电器,因而又称JZXC-480型轨道…

今日分享丨点亮这四个技能,你也可以成为可视化专家

引言 以大数据、人工智能等为代表的新质生产力时代已悄然而至,央企、国企逐步意识到数据资源展示对于经营管理的重要性和紧迫性。数据可视化成为连接用户与数据的桥梁,藉由设计师的巧手,把复杂抽象的数据以基于管理需求,转化为直…

PAT B1018.锤子剪刀布

题目描述 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图3-1所示。 现给出两人的交锋记录,请统计双方的胜、平、负次数,并给出双方分别出什么手势的胜算最大。输入格式 第一行给出正整数N(≤10),即双方交锋的次数。随后N行,每行给…

探索Web Components

title: 探索Web Components date: 2024/6/16 updated: 2024/6/16 author: cmdragon excerpt: 这篇文章介绍了Web Components技术,它允许开发者创建可复用、封装良好的自定义HTML元素,并直接在浏览器中运行,无需依赖外部库。通过组合HTML模…

Top10在线音频剪辑软件,你了解几款?(免费分享)

多年来,随着音乐制作人和音频工程师的需求不断增长,音频剪辑软件领域经历了巨大的发展。最新的音频剪辑软件提供了从基本录制到最终发布所需的一切功能。其中一些软件专为播客设计,一些软件是免费的,并且一些软件提供了出色的音效…

python读取excel中的图片超链接,批量下载到本地

1、代码 import xlrd import requestsread_path C:\\Users\\asus\\Desktop\\大法\\公务员\\国考\\行测\\1-推理判断\\URLs.xlsx bk xlrd.open_workbook(read_path) shxrange range(bk.nsheets) sh bk.sheet_by_name("Sheet2") nrows sh.nrows ncols sh.ncols …

【自撰写】【国际象棋入门】第6课 常见术语分析(一)吃双和抽将

第6课 常见术语分析(一)吃双和抽将 本次课中,我们介绍几种最为常见和常用的(单步棋形成)的局面、术语并对其进行简单的分析。一般说来,这些局面都会给予一方以“立竿见影”的优势,或者引向之后…

“鸿蒙开发之图片下载”--案例问题整理

鸿蒙开发之图片下载 关于以上连接中案例demo使用问题整理如下图 而且在写这个案例的时候记得添加权限 "requestPermissions":[{"name" : "ohos.permission.INTERNET"}]

Java多线程设计模式之不可变对象(Immutable Object)模式

简介 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不加锁的情况下,既保证共享变量访问的线程安全,又能避免引入锁可能带…

20240619在飞凌OK3588-C的Linux R4系统下查找MIPI YUV摄像头的csi size err

20240619在飞凌OK3588-C的Linux R4系统下查找MIPI YUV摄像头的csi size err 2024/6/19 14:00 缘起,公司使用LVDS OUT的机芯,4LANE的LVDS输出。1920x108030分辨率(1080p/30) 通过FPGA转换为2LANE的MIPI OUT之后进RK3588/OK3588-C。…

sqlite3指令操作-linux

1.查看当前数据库位置 2.查看当前数据库文件下有哪些表 3.显示 某表创建时的SQL语句 4.打开、关闭显示列标题; 5.列对齐显示 6.列以‘,’分隔显示 .separator 7.查询表信息 8.插入消息 9.删除某一行内容 10.修改某行某列内容 11.修改表名字 alter tab…

【Redis】Redis内存使用优化方法

目录 1. 数据结构选择和优化 2. 内存优化策略 配置文件优化 内存碎片整理 3. 过期策略和持久化配置 4. 连接和客户端优化 5. 监控和调优 6. 硬件和部署优化 7. 使用虚拟内存 8. Redis Cluster和分片 9. 内存碎片整理与优化 10. 使用内置命令和功能 11. 操作系统和…

浅谈golang字符编码

1、 Golang 字符编码 Golang 的代码是由 Unicode 字符组成的,并由 Unicode 编码规范中的 UTF-8 编码格式进行编码并存储。 Unicode 是编码字符集,囊括了当今世界使用的全部语言和符号的字符。有三种编码形式:UTF-8,UTF-16&#…

2024年项目进度控制软件大比拼:找出适合您团队的最佳工具

本文整理了9大热门项目进度控制软件:PingCode、Worktile、Monday.com、Asana、Trello、Jira、ClickUp、Wrike、Zoho Projects。并且进行详细介绍对比。 在项目管理工具的选择上,不同规模的团队有着各自的需求和偏好。例如,小型团队倾向于选择…

新手搭建Magic-API

项目场景: 我本是一个前端和GIS开发工程师,但新单位并没有配置完整的开发团队,确切说目前只有我一个人做开发,那么肯定避免不了要研究下后端。最近有一个小程序要开发,管理平台我直接用的fastAdminthinkphp写完了页面…

终极版本的Typora上传到博客园和csdn

激活插件 下载网址是这个: https://codeload.github.com/obgnail/typora_plugin/zip/refs/tags/1.9.4 解压之后这样的: 解压之后将plugin,复制到自己的安装目录下的resources 点击安装即可: 更改配置文件 "dependencies&q…