我正试图在java和c++中编写WebSocket服务器,但我现在卡住了。使用java和java.net.ServerSocket/java.net.Socket我成功地获得了连接并成功地进行了握手,但由WebSocket发送到java服务器的数据并不完全是我所期望的。
像这样从javascript发送消息时:
var count = 0;
function loop(){
websocket.send("loop: " + count + "n");
count++;
setTimeout(loop, 100);
}
Java服务器接收这个消息,每隔一段时间换行,但不是每个websocket.send()都被调用。
?‡½÷"˜N˜我‡×?‡AI3 -¡C{?‡œ我(Ua¢4%¶ii ?‡美元Ia Hø¢ŠˆiO ?‡·†Þž问题±?¦e ?‡"½Ø…KO·o ? ?‡窦"
½´^ oi ?‡+ u ? YG-a) uº?‡;?
E÷ab»¡¯5 ?‡我œ问¦!我们µ吗?ˆ:J阵线% f6
Java服务器使用BufferedReader.readLine()
从套接字检索值BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line =socketReader.readLine();
这在握手中工作得很好,所有的握手数据都是可读的,但在握手完成后它就不起作用了。
握手后的数据是否加密?我怎么读?
编辑:
程序文件
SocketConnectTest.html
ServerTest.java
ClientSessionTest.java
ResponseGenerator.java
输出
运行ServerTest.java,然后打开SocketConnectTest.html。
initclientlistener()处理来自客户端的消息。
解决方案:关于解决方案,请参阅下面的pimvdbs帖子和他在如何(de)在WebSockets hybi 08+中构造数据帧的回答?
通过web套接字的数据是原始的,而不是字符串编码的数据。
我建议不要在传入数据周围包装BufferedReader,因为数据包是用0x00字节帧的。您看到的这些疯狂的字符是Java不理解数据所使用的编码的结果。
你需要负责将数据分解成字符和控制部分。一旦将数据分割成适当的区域,就可以将数据解码为字符串。