Java:WebSocket服务器赢得';不能正确地向客户端发送数据

Java:WebSocket服务器赢得';不能正确地向客户端发送数据,websocket,Websocket,握手已正确完成,服务器可以解码来自客户端的数据,但当我尝试向客户端发送数据时,客户端会关闭连接 我一直用w作为客户。Firefox和Chrome的最新版本 这是我试图发送的数据帧: 129 10000001 4 100 116 1110100 101 1100101 115 1110011 116 1110100 ------- fin:true opcode:1 len:4 masked:false masks:[0, 0, 0, 0] payload:test ?♦test http://

握手已正确完成,服务器可以解码来自客户端的数据,但当我尝试向客户端发送数据时,客户端会关闭连接

我一直用w作为客户。Firefox和Chrome的最新版本

这是我试图发送的数据帧:

129 10000001
4 100
116 1110100
101 1100101
115 1110011
116 1110100
-------
fin:true
opcode:1
len:4
masked:false
masks:[0, 0, 0, 0]
payload:test
?♦test

http://tools.ietf.org/html/rfc6455#section-5
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+


*/
以及负责向客户端发送数据的服务器端方法:

public void sendData(Socket socket, byte[] dataBytes){
        System.out.println(java.util.Arrays.toString(dataBytes));
        //[-127, 4, 116, 101, 115, 116]
        for(byte b:dataBytes) System.out.println(Integer.toString((int)0xff&b,2));
        /*
        10000001
        100
        1110100
        1100101
        1110011
        1110100        
        */

        try{

                InputStream data = new ByteArrayInputStream(dataBytes);
                OutputStream out = socket.getOutputStream();
                //tested with ByteArrayOutputStream and written data == dataBytes


                //out.write((byte)0x00); //tried with and without this
                if ( data != null )
                {
                // tried also out.write(dataBytes) intstead of this 
                        byte[] buff = new byte[2048];
                        while (true)
                        {
                                        int read = data.read( buff, 0, 2048 );
                                        if (read <= 0)
                                                break;
                                        out.write( buff, 0, read );
                                }
                        }
                //out.write(-1);               
                //out.write((byte)0xFF);       
                out.flush();

                //out.close();
                if ( data != null )
                        data.close();


        }catch(Exception e){
                e.printStackTrace();
                sockets.remove(socket);
        }

}
public void sendData(套接字,字节[]数据字节){
System.out.println(java.util.Arrays.toString(dataBytes));
//[-127, 4, 116, 101, 115, 116]
对于(字节b:dataBytes)System.out.println(Integer.toString((int)0xff&b,2));
/*
10000001
100
1110100
1100101
1110011
1110100
*/
试一试{
InputStream数据=新的ByteArrayInputStream(数据字节);
OutputStream out=socket.getOutputStream();
//使用ByteArrayOutputStream和写入数据==数据字节进行测试
//out.write((字节)0x00);//尝试使用和不使用此选项
如果(数据!=null)
{
//也尝试过。写入(数据字节)代替此
字节[]buff=新字节[2048];
while(true)
{
int read=data.read(buff,02048);
如果(阅读一些问题:

  • 在从服务器发送之前,是否等待连接完全打开
  • 你能用wireshark捕捉到这条流,看看这条线上到底有什么吗
  • 在Chrome的Javascript控制台中,您是否看到任何与WebSocket相关的错误
  • 在Javascript websocket对象的onclose处理程序中,是否可以console.log事件中的代码值和原因
像这样:

ws.onclose = function (e) {
    console.log("closed - code " + e.code + ", reason " + reason);
}
您的问题(可能)是使用旧的协议。请使用较新的协议

@看


具有客户端和服务器的工作源代码(Java)。

1.是2.尝试在ByteArrayOutputStream上写入数据,并且已签出,我将在下一步尝试wireshark 3.“无法识别的帧操作码:15”4.“已关闭-代码1006,原因”解决了。我完全不知道哪里出了问题,也不知道我做了什么来解决它,但现在它工作了。很棒。图像很好。Chrome错误表明它不知何故收到了一个操作码设置为15而不是1的帧。这就是wireshark可以派上用场的地方(只需在“端口80”或您的WebSocket服务器上的任何端口上进行过滤)此外,如果你发现这有助于找到问题的底部,你可以考虑选择答案,以便那些在将来寻找类似的东西的人会发现可能有一些有用的数据。