编写WebSocket服务器

时间:2011-10-26 08:56:46

标签: java websocket

我正在尝试用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+?

的回答

1 个答案:

答案 0 :(得分:4)

来自Web套接字的数据是原始数据,而不是字符串编码数据。

我建议不要在传入数据周围包装一个BufferedReader,因为数据包的帧数为0x00字节。您看到的疯狂角色是Java无法理解数据所在的编码的结果。

您需要负责将数据拆分为字符和控件。将数据拆分到适当的区域后,就可以将数据解码为字符串。