【问题标题】:InputStream Java from JavaScript Websocket isn't getting full message来自 JavaScript Websocket 的 InputStream Java 没有收到完整的消息
【发布时间】:2017-03-18 17:06:51
【问题描述】:

我有以下设置: Index.html(网页)

    <div id="sse">
         <a href="javascript:WebSocketTest()">Run WebSocket</a>
         <a href="javascript:websocketsend()">Send message</a>
      </div>

    <script type="text/javascript">
        var ws;
         function WebSocketTest()
         {
            if ("WebSocket" in window)
            {
               console.log("WebSocket is supported by your Browser!");

               // Let us open a web socket
               ws = new WebSocket("ws://localhost:6790/");

               ws.onopen = function()
               {
                  // Web Socket is connected, send data using send()

                  ws.send("Hello_World!");
                  console.log("Message is sent...");

               };

               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  console.log("Message is received...");
               };

               ws.onclose = function(event)
               { 
                    var reason;
                  // websocket is closed.
                  console.log(event.code); 
                  console.log("closed.")
               }

               ws.onerror = function (evt)
               {
                    console.log(evt);
               }
            }

            else
            {
               // The browser doesn't support WebSocket
               console.log("WebSocket NOT supported by your Browser!");
            }
         }
    </script>

Java 套接字服务器

private String decodeMessage(InputStream in) {
    Main.debug(in + "");
    try { 
        in.skip(2);
        ArrayList<Byte> keys = new ArrayList<Byte>();
        for(int i = 0; i < 4; i++){
            int r = in.read();
            Main.debug("added: " + r);
            keys.add((byte) r);
        }

        ArrayList<Byte> encoded = new ArrayList<Byte>();
        for(int i = 0; i < in.available(); i++){
            int r = in.read();
            Main.debug("added2: " + r);
            encoded.add((byte) r);
        }

        ArrayList<Byte> decoded = new ArrayList<Byte>();
        for(int i = 0; i < encoded.size(); i++){
            decoded.add((byte) (encoded.get(i) ^ keys.get(i & 0x3)));
            Main.debug("Decoded: " + (encoded.get(i) ^ keys.get(i & 0x3)));
        }

        Main.debug("Total: " + decoded);
        String s = new String(toByteArray(decoded), "US-ASCII");
        Main.debug("Text: " + s);

    } catch(IOException e) {

    }

    return null;
}       

public static byte[] toByteArray(List<Byte> in) {
    final int n = in.size();
    byte ret[] = new byte[n];
    for (int i = 0; i < n; i++) {
        ret[i] = in.get(i);
    }
    return ret;
}

问题是消息可以正常通过,但是我将其作为输出 (除了“添加”和“解码”调试消息,

[19:42:02 信息]:总计:[72、101、108、108、111、95] [19:42:02 INFO]:文本:Hello_

所以“世界!”即使我用空格替换 _ 也会丢失。 有什么我忽略的吗?

我希望有人可以在这里给我一个提示。 提前致谢!

【问题讨论】:

  • 使用available() 不是从InputStream 读取所有数据的可靠方法。
  • @Titus 还有什么办法?
  • 您重新读取来自InputStream 的数据,直到您到达文件EOF 的末尾或直到读取了整条消息。第二个选项(直到读取整条消息)取决于您使用的协议,如果您想自己实现websocket 协议,您必须阅读文档以了解它是如何工作的。跨度>
  • 在我看来,您应该使用实现websocket 协议的库。你应该看看这个:stackoverflow.com/questions/4003102/…
  • @Tinus 谢谢,你给了我解决方案,我实际上必须使用 DataInputStream 和 while(dis.available()) 。现在它完全可以工作了。谢谢!

标签: javascript java websocket inputstream


【解决方案1】:

然后将其转换为 DataInputStream

while(datainputstream.available() > 0){
     ....
}

似乎可以解决它! 感谢 @Tinus 帮助我找到这个解决方案!

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2019-07-30
    • 1970-01-01
    • 2013-08-13
    • 2015-06-23
    • 2013-11-12
    相关资源
    最近更新 更多