关于python-socket服务的问题记录

概述

在使用python+websocket部署socket服务,前端使用小程序来连接,过程中存在以下可能出现的问题:

1,代码里socket端口问题2,服务器配置问题(域名解析?Nginx配置是否正确处理了WebSocket升级头?)3,小程序端口配置错误(是否是443:wss://example.com:443)

1,代码里socket端口问题

代码里端口设置为:8765。特别要留意端口是否在安全组里添加入站规则,在服务器面板中添加:

# coding: utf-8
import asyncio
import json
import logging
import websockets
from datetime import datetime
from threading import Thread
import time# 全局变量存储所有连接的客户端
connected_clients = {}async def handle_message(websocket, message):"""处理客户端消息"""try:data = json.loads(message)action = data.get("action")if action == "login":# 用户登录user_id = data["user_id"]connected_clients[user_id] = websocketawait broadcast_system_message(f"用户 {user_id} 上线了")print(f"用户 {user_id} 已连接")elif action == "chat":# 聊天消息sender = data["user_id"]content = data["content"]target = data.get("target")if target:  # 私聊await send_private_message(sender, target, content)else:  # 群发await broadcast_message(sender, content)except Exception as e:print(f"消息处理错误: {e}")async def send_private_message(sender, target, content):"""发送私聊消息"""if target in connected_clients:message = {"type": "private","from": sender,"content": content,"time": datetime.now().strftime("%H:%M:%S")}await connected_clients[target].send(json.dumps(message))print(f"私聊消息: {sender} -> {target}: {content}")async def broadcast_message(sender, content):"""广播消息给所有用户"""message = {"type": "public","from": sender,"content": content,"time": datetime.now().strftime("%H:%M:%S")}for user_id, client in connected_clients.items():if client.open:await client.send(json.dumps(message))print(f"广播消息: {sender}: {content}")async def broadcast_system_message(content):"""发送系统通知"""message = {"type": "system","content": content,"time": datetime.now().strftime("%H:%M:%S")}for user_id, client in connected_clients.items():if client.open:await client.send(json.dumps(message))async def handle_connection(websocket, path):"""处理新连接"""user_id = Nonetry:async for message in websocket:await handle_message(websocket, message)except websockets.exceptions.ConnectionClosed:passfinally:if user_id in connected_clients:del connected_clients[user_id]await broadcast_system_message(f"用户 {user_id} 下线了")print(f"用户 {user_id} 已断开")async def health_check():"""心跳检测(每30秒清理死连接)"""while True:await asyncio.sleep(30)dead_clients = [user_id for user_id, client in connected_clients.items()if not client.open]for user_id in dead_clients:del connected_clients[user_id]async def main():startup_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"【服务启动】Chat Server 启动时间: {startup_time}")# 启动心跳检测asyncio.create_task(health_check())# 启动WebSocket服务器server = await websockets.serve(handle_connection,"0.0.0.0",  # 监听所有IP8765,       # 端口ping_interval=None  # 禁用自动ping(手动实现心跳))print("聊天服务器已启动,等待连接...")await server.wait_closed()if __name__ == "__main__":asyncio.run(main())

2,服务器配置问题

①直接访问地址(chat.y***.cn),发现不能访问,首先考虑域名解析问题,添加域名解析:

②项目使用Nginx反向代理,检查Nginx配置是否正确处理了WebSocket升级头,查看网站配置,添加内容:

location / {proxy_pass http://localhost:8765;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

3,小程序端口配置错误(是否是443:wss://example.com:443)

这个容易犯的低级错误,端口直接填写了8765。 

4,前端测试代码

wx.connectSocket({url: 'wss://chat.*****.cn:443',success: () => console.log('连接成功'),fail: (err) => console.error('连接失败', err)})

输出:连接成功

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

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

相关文章

typescript vs go vs rust

typescript 后端选型: Express &Typescript &trpc 广泛使用,灵活,快速,稳定 Nestjs 企业级,标准化,像java ,依赖注入, Hono , web standards framework. Support for any J…

OpenGL和OpenGL ES区别

OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)都是用于图形渲染的API,但它们的目标平台和设计定位有所不同。 1. 目标平台 OpenGL 主要用于桌面平台(如Windows、macOS、Linux&a…

PyTorch 入门之官方文档学习笔记(一)

目录 1 张量 1)张量的初始化和属性 2)张量操作 3)使用 NumPy 进行桥接 2 torch.autograd 1)背景 2)在 PyTorch 中的使用 3)Autograd 的微分机制 4)计算图原理 5)从计算图中…

King’s LIMS 系统引领汽车检测实验室数字化转型

随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…

Neo4j常见语句-merge

merge用法&#xff1a;MERGE 是 Neo4j 中一个强大的操作符&#xff0c;用于确保图中存在特定的节点或关系。它的核心逻辑是&#xff1a;如果目标存在则匹配&#xff0c;不存在则创建 基本语法与逻辑&#xff1a; MERGE <pattern> [ON CREATE <create_clause>] //…

Mem0多级记忆实现机制详解

在人工智能交互场景中,记忆能力是实现个性化服务与智能决策的关键。Mem0 通过设计分层记忆架构,实现了对用户、会话和智能体状态的多级管理。各层级记忆既相互独立存储,又通过精密的关联机制协同运作,确保在不同场景下都能提供精准的上下文支持,显著提升 AI 交互的智能性与…

Python 爬虫入门 Day 5 - 使用 XPath 进行网页解析(lxml + XPath)

Python 第二阶段 - 爬虫入门 &#x1f3af; 今日目标 掌握 XPath 的基本语法使用 lxml.etree 解析 HTML&#xff0c;提取数据与 BeautifulSoup 比较&#xff1a;谁更强&#xff1f; &#x1f4d8; 学习内容详解 ✅ 安装依赖 pip install lxml&#x1f9e9; XPath 简介 XPa…

变幻莫测:CoreData 中 Transformable 类型面面俱到(六)

概述 各位似秃似不秃小码农们都知道&#xff0c;在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过&#xff0c;大家是否知道在 CoreData 中还存在一个 Transfo…

Vuex(一) —— 集中式的状态管理仓库

目录 Vue组件间通信方式回顾 组件内的状态管理流程组件间通信方式 父组件给子组件传值 (最简单的一种方式)子组件给父组件传值不相关组件之间传值其他常见方式($ref) 简易的状态管理方案 上面组件间通信方式的问题集中式的状态管理方案 Vuex 什么是Vuex?什么情况下使用Vuex?…

操作系统---内存管理上

文章目录 1. 内存的基础知识1.1 什么是内存&#xff0c;有何作用1.2 进程运行的基本原理1.2.1 指令的工作原理1.2.2 逻辑地址 VS 物理地址 1.3 如何实现地址转换&#xff08;逻辑 -> 物理&#xff09;1.3.1 绝对装入1.3.2 可重定位装入&#xff08;静态重定位&#xff09;1.…

医学图像处理期末复习

目录 考试范围第1章 绪论1.1 数字图像处理的概念1.2 数字图像处理的应用领域1、医学领域2、其他领域 1.3 数字图像处理基础1.4 数字图像基础运算 第2章 医学图像灰度变换与空间滤波2.1 医学图像灰度变换线性灰度变换非线性灰度变换 2.2 直方图均衡化√2.3 空间平滑滤波线性空间…

类图:软件世界的“建筑蓝图”

本文来自「大千AI助手」技术实战系列&#xff0c;专注用真话讲技术&#xff0c;拒绝过度包装。 类图&#xff08;Class Diagram&#xff09;&#xff1a;软件世界的“建筑蓝图” 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09; 中最重要…

利用DevEco Studio对RK3588的HiHopesOS-4.1.110(OpenHarmony)进行Qt程序编写

文章目录 热身准备添加Qt库运行qml程序 热身 可以先看我这篇文章【DevEco Studio中使用Qt&#xff0c;编写HarmonyOS程序】 准备 板子的主要信息 目前由于系统版本&#xff08;API 11&#xff09;及其他原因&#xff0c;只能用4.1版本的DevEcoStudio来编写&#xff0c;更高…

设计模式精讲 Day 5:原型模式(Prototype Pattern)

【设计模式精讲 Day 5】原型模式&#xff08;Prototype Pattern&#xff09; 文章内容 在“设计模式精讲”系列的第5天&#xff0c;我们将深入讲解原型模式&#xff08;Prototype Pattern&#xff09;。作为创建型设计模式之一&#xff0c;原型模式通过复制已有对象来创建新对…

深度学习——第2章习题2-1分析为什么平方损失函数不适用于分类问题

深度学习——第2章习题2-1 《神经网络与深度学习》——邱锡鹏 2-1 分析为什么平方损失函数不适用于分类问题。 平方损失函数&#xff08;Quadratic Loss Function&#xff09;经常用在预测标签y为实数值的任务中&#xff0c;定义为 L ( y , f ( x ; θ ) ) 1 2 ( y − f (…

【Linux】运行脚本后打屏同时保存到本地

命令&#xff1a; sh run.sh 2>&1 | tee output.log sh run.sh 2>&1 | tee output_$(date "%Y%m%d%H%M").log作用&#xff1a;运行脚本&#xff0c;并同时将输出&#xff08;包括标准输出和错误输出&#xff09;显示到终端&#xff0c;并保存到文件中…

Spark 在小众日常场景中的实战应用:从小店数据到社区活动

Spark 在小众日常场景中的实战应用&#xff1a;从小店数据到社区活动​ 提起 Spark&#xff0c;大家往往会联想到大型互联网公司的数据处理、金融行业的复杂分析。但实际上&#xff0c;Spark 在许多小众、贴近生活的场景中也能大显身手。结合学习与实践&#xff0c;我探索了 S…

mysql 执行计划 explain命令 详解

explain id &#xff1a;select查询的序列号&#xff0c;包含一组数字&#xff0c;表示查询中执行select子句或操作表的顺序select_type&#xff1a;查询类型 或者是 其他操作类型table &#xff1a;正在访问哪个表partitions &#xff1a;匹配的分区type &#xff1a;访问的类…

让大模型“更懂人话”:对齐训练(RLHF DPO)全流程实战解析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

GO 原子操作面试题及参考答案

Go 的 sync/atomic 包和 sync.Mutex 的根本区别是什么&#xff1f; Go 语言中的 sync/atomic 包和 sync.Mutex 都用于处理并发编程中的同步问题&#xff0c;但它们的实现机制、应用场景和性能特性存在根本差异。理解这些差异对于编写高效、安全的并发代码至关重要。 sync/atomi…