WebSocketChannel连接sip.iptel.org服务器无响应问题求助
WebSocket无法接收目标服务器响应问题分析与解决
问题概述
我尝试通过WebSocket服务器接收响应,但仅能看到自己发送给服务器的内容,无法获取服务器应返回的响应。测试代码(非完整)如下:
final wsUrl = Uri.parse('wss://sip.iptel.org:8081/ws'); final channel = WebSocketChannel.connect(wsUrl); await channel.ready; channel.stream.listen((message) { channel.sink.add('received!'); });
使用wss://echo.websocket.events测试时能正常接收响应,但连接wss://sip.iptel.org:8081/ws时无任何内容返回。
原因分析
wss://sip.iptel.org:8081/ws是SIP-over-WebSocket网关服务器,和普通echo服务器逻辑完全不同:
- Echo服务器的核心功能是返回收到的所有内容,无需遵循特定协议;
- SIP网关仅会对符合SIP协议规范的请求做出响应,不会主动推送内容,也不会返回非SIP格式的消息。你的代码目前没有向服务器发送合法的SIP请求,因此服务器没有响应返回。
解决方案
1. 发送符合SIP规范的请求
修改代码,向服务器发送合法的SIP请求(比如REGISTER注册请求),示例如下:
final wsUrl = Uri.parse('wss://sip.iptel.org:8081/ws'); final channel = WebSocketChannel.connect(wsUrl); await channel.ready; // 替换为你的本地IP/域名,生成唯一的Call-ID和Tag final localAddress = '192.168.1.100'; final callId = '${DateTime.now().millisecondsSinceEpoch}@$localAddress'; final fromTag = 'tag-${DateTime.now().microsecondsSinceEpoch}'; // 发送SIP REGISTER请求 channel.sink.add('REGISTER sip:iptel.org SIP/2.0\r\n' 'Via: SIP/2.0/WSS $localAddress;branch=z9hG4bK-${DateTime.now().millisecondsSinceEpoch}\r\n' 'Max-Forwards: 70\r\n' 'To: <sip:test_user@iptel.org>\r\n' 'From: <sip:test_user@iptel.org>;tag=$fromTag\r\n' 'Call-ID: $callId\r\n' 'CSeq: 1 REGISTER\r\n' 'Contact: <sip:test_user@$localAddress;transport=wss>\r\n' 'Expires: 3600\r\n' '\r\n'); // 监听服务器响应及错误 channel.stream.listen((message) { print('服务器响应:\n$message'); }, onError: (error) { print('WebSocket错误: $error'); }, onDone: () { print('连接已关闭'); });
2. 关键注意事项
- 替换代码中的
localAddress为你的实际本地IP或可访问的域名; Call-ID、From标签(tag)必须保证唯一,避免重复请求被服务器拒绝;- SIP请求的格式必须严格遵循RFC 3261规范,尤其是换行符必须使用
\r\n,最后以空行结尾。
3. 排查工具
可以使用Wireshark抓包分析WebSocket帧,确认请求是否正确发送,以及服务器是否有返回内容,帮助定位协议格式或连接问题。
内容的提问来源于stack exchange,提问作者sergi
相关产品推荐
相关产品推荐

