使用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
相关产品推荐
相关产品推荐

