TCP+WebSocket双向转发服务器 完整部署运维手册

方案 1:复制全部文字,新建记事本保存成文档(最简单,本地直接下载)

新建文本文档,把下面整段全部粘贴进去,保存为 TCP-WS服务部署手册.txt 即可本地留存

plaintext

复制代码
# TCP+WebSocket双向转发服务器 完整部署运维手册
## 一、项目说明
本服务实现 TCP客户端 ↔ 网页WebSocket 双向消息互通:
1. TCP设备发消息 → 网页实时接收展示
2. 网页发送消息 → 所有TCP设备实时接收
端口分配:
- WebSocket网页服务:8080
- TCP设备连接服务:8081

## 二、全新部署完整步骤(从零搭建)
### 步骤1:清理旧服务进程
pkill -f "python3 tcp_server.py"

### 步骤2:写入服务端完整代码
cat > tcp_server.py << 'EOF'
import asyncio
import websockets
from datetime import datetime

ws_clients = set()
tcp_clients = set()

async def send_to_all_tcp(text):
    for sock in tcp_clients:
        try:
            sock.write((text+"\n").encode("utf-8"))
            await sock.drain()
        except:
            pass

async def send_to_all_ws(text):
    for ws in ws_clients:
        try:
            await ws.send(text)
        except:
            pass

async def ws_handler(websocket):
    ws_clients.add(websocket)
    print("【网页控制台】浏览器已接入")
    try:
        while True:
            msg = await websocket.recv()
            now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            log = f"[{now}] 网页下发消息:{msg}"
            print(log)
            await send_to_all_tcp(msg)
    except Exception as e:
        print("【网页】连接断开", e)
    finally:
        ws_clients.remove(websocket)

async def tcp_handler(reader, writer):
    tcp_clients.add(writer)
    addr = writer.get_extra_info('peername')
    print(f"【TCP客户端】{addr} 连接成功")
    try:
        while True:
            data = await reader.read(1024)
            if not data:
                break
            msg = data.decode("utf-8").strip()
            now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            log = f"[{now}] TCP设备{addr}:{msg}"
            print(log)
            await send_to_all_ws(f"设备[{addr}]:{msg}")
    except Exception as e:
        print("【TCP设备】断开", e)
    finally:
        tcp_clients.remove(writer)
        writer.close()
        await writer.wait_closed()

async def main():
    tcp_server = await asyncio.start_server(tcp_handler, "0.0.0.0", 8081)
    ws_server = websockets.serve(ws_handler, "0.0.0.0", 8080)

    async with tcp_server, ws_server:
        print("===== 服务启动完成 =====")
        print("网页WebSocket地址:ws://8.134.197.176:8080")
        print("TCP客户端连接端口:8081")
        await asyncio.Future()

if __name__ == "__main__":
    asyncio.run(main())
EOF

### 步骤3:服务器防火墙放行端口
ufw allow 8080/tcp
ufw allow 8081/tcp

### 步骤4:阿里云安全组配置(必做)
1. 登录阿里云后台 → 实例安全组 → 入站规则
2. 添加两条TCP规则:
   - 端口8080,来源IP 0.0.0.0/0
   - 端口8081,来源IP 0.0.0.0/0

### 步骤5:后台常驻启动服务(仅执行一次)
pkill -f "python3 tcp_server.py"
nohup python3 tcp_server.py > server.log 2>&1 &

## 三、测试验证操作
1. 实时查看运行日志
tail -f server.log
2. 客户端连接参数
网页端:本地打开msg.html,自动连接 ws://8.134.197.176:8080
TCP调试工具:IP 8.134.197.176 端口8081

## 四、常见报错排错
### 报错1:端口被占用 OSError: [Errno 98]
# 查看占用端口进程
lsof -i :8081
# 强制杀死进程,替换查到的PID
kill -9 进程ID
# 一键清理全部服务进程
pkill -f "python3 tcp_server.py"

### 报错2:多进程冲突
原因:多次执行后台启动命令,端口争抢;解决:批量清理进程后单次启动。

## 五、运维常用命令
# 查看服务进程
ps aux | grep tcp_server
# 实时监控日志
tail -f server.log
# 完整重启服务
pkill -f "python3 tcp_server.py"
nohup python3 tcp_server.py > server.log 2>&1 &

## 六、正常启动标准输出
===== 服务启动完成 =====
网页WebSocket地址:ws://8.134.197.176:8080
TCP客户端连接端口:8081

方案 2:服务端 Python 代码单独下载保存

相关推荐
木子欢儿11 分钟前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall20 分钟前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
迪菲赫尔曼23 分钟前
【基础篇 26】第一次在服务器完成训练:准备数据、断线继续、检查成果与备份
运维·服务器·人工智能·机器学习·计算机视觉
进击的荆棘28 分钟前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
.道阻且长.1 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
vipxieliang1 小时前
可观测性与安全的融合:统一数据平台的建设实践
运维·openai·自动化运维
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
进击的荆棘2 小时前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
流浪0012 小时前
计算机网络篇22:网络层——公网的三级地址划分与逐跳转发,从私网出口替换到 IP 分片组装
tcp/ip·计算机网络·路由器·公网搭建·报文分篇
一个天蝎座 白勺 程序猿11 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库