我正在尝试用Java和C ++编写WebSocket服务器,但我现在卡住了。 使用java和java.net.ServerSocket / java.net.Socket我设法获得连接并成功完成握手,但WebSocket发送到Java Server的数据并不完全符合我的预期。
从这样的javascript发送消息时:
var count = 0;
function loop(){
websocket.send("loop: " + count + "\n");
count++;
setTimeout(loop, 100);
}
Java服务器接收到这一点,不时地使用换行符,但不是每次调用的websocket.send()。
?‡½÷“~Ñ~Mè‡×?‡AI3-¡C{IN?‡OEI [UA¢4%¶íi?‡$ÍåøH¢的SiO 2·‡†ÞžÛé±I?|ê?‡ '½Ø...... KO·Ø?í?‡都'
½'á^ OI?‡+ U?YG-A)Ùº?‡>?
Ë÷àb»¡5?‡mÉŒQ|ã!Wéμ?:J FV%f6
Java服务器使用BufferedReader.readLine()
从套接字中检索值BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line =socketReader.readLine();
这适用于握手,并且所有握手数据都是可读的,但在握手完成后它不起作用。
握手后的数据是否以某种方式加密?我怎么读呢?
编辑:
程序文件:
SocketConnectTest.html
ServerTest.java
ClientSessionTest.java
ResponseGenerator.java
output
只需运行ServerTest.java,然后打开SocketConnectTest.html ClientSessionTest.initClientListener()处理来自客户端的消息。
解决方案: 有关解决方案,请参阅下面的pimvdbs和How to (de)construct data frames in WebSockets hybi 08+?
的回答答案 0 :(得分:4)
来自Web套接字的数据是原始数据,而不是字符串编码数据。
我建议不要在传入数据周围包装一个BufferedReader,因为数据包的帧数为0x00字节。您看到的疯狂角色是Java无法理解数据所在的编码的结果。
您需要负责将数据拆分为字符和控件。将数据拆分到适当的区域后,就可以将数据解码为字符串。