You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tungstenite与TcpListener搭建WebSocket服务器遇端口无效错误

问题排查:WebSocket服务器"invalid port value"错误

原因分析

核心问题出在传入的端口字符串不符合合法端口的格式要求:

  • TCP端口的合法范围是0-65535,必须是纯数字格式,不能包含空格、换行符、字母等多余字符
  • 当前代码直接将传入的String类型端口拼接成地址,未做任何校验或类型转换,一旦传入的端口字符串不合法(比如空串、非数字内容、数值超出范围),TcpListener::bind就会抛出InvalidInput错误

解决方法

1. 从源头约束端口类型(推荐)

将端口参数从String改为u16(u16的取值范围正好覆盖0-65535的合法端口范围),强制调用方传入合法的端口值:

use std::net::TcpListener;
use std::thread::spawn;
use tungstenite::accept;

fn run_server(port: u16) {
    let addr = format!("127.0.0.1:{}", port);
    println!("Full Host: {}", addr);
    let server = TcpListener::bind(addr).unwrap();
    for stream in server.incoming() {
        spawn(move || {
            let mut websocket = accept(stream.unwrap()).unwrap();
            loop {
                let msg = websocket.read().unwrap();
                if msg.is_binary() || msg.is_text() {
                    websocket.send(msg).unwrap();
                }
            }
        });
    }
}

// 调用示例
fn main() {
    run_server(8080); // 直接传入合法的u16类型端口
}

2. 保留String参数但增加校验逻辑

如果必须使用String作为端口参数,需要先转换为u16并校验合法性:

use std::net::TcpListener;
use std::thread::spawn;
use tungstenite::accept;

fn run_server(port_str: String) {
    // 清理字符串首尾空白并转换为u16,转换失败时给出明确提示
    let port = port_str.trim()
        .parse::<u16>()
        .expect("端口必须是0-65535之间的整数");
    
    let addr = format!("127.0.0.1:{}", port);
    println!("Full Host: {}", addr);
    let server = TcpListener::bind(addr).unwrap();
    for stream in server.incoming() {
        spawn(move || {
            let mut websocket = accept(stream.unwrap()).unwrap();
            loop {
                let msg = websocket.read().unwrap();
                if msg.is_binary() || msg.is_text() {
                    websocket.send(msg).unwrap();
                }
            }
        });
    }
}

// 调用示例
fn main() {
    run_server("8080".to_string()); // 传入合法的数字字符串
}

额外注意事项

  • 如果端口是从命令行或外部配置读取的,务必检查是否包含多余的空白字符(比如换行符、空格),用trim()清理后再处理
  • 避免直接拼接未校验的字符串到地址中,始终确保端口部分是合法的数值

内容的提问来源于stack exchange,提问作者Karg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:53:16