【问题标题】:Writing WebSocket Server on Java. Issue on Windows 7 64 bits在 Java 上编写 WebSocket 服务器。 Windows 7 64 位上的问题
【发布时间】:2015-06-23 18:58:00
【问题描述】:

WebSocket 协议有问题。

当我在开发(NetBeans)时执行代码并且工作正常时,即使我执行jar文件仍然有效,但是......当我在Windows 7 64位平台上执行jar时...... WebSocket自行关闭.

我在服务器和客户端都在本地机器上工作,即使我停用了 Windows 防火墙并且没有任何变化。

即使我使用 3 种浏览器(Firefox、Chrome 和 Opera)进行测试,结果也是一样的。

有什么想法吗?

服务器监听线程代码

InputStream listen;

    while (true) {
        try {
            if (socket.isClosed()) {
                socket.close();
                return;
            } else {
                listen = socket.getInputStream();
                byte[] readData = new byte[1024];
                int totalRead = listen.read(readData);

                if (totalRead > 0) {
                    byte[] result = new byte[totalRead];

                    System.arraycopy(readData, 0, result, 0, totalRead);

                    String resultString = new String(result);

                    if (resultString.substring(0, 3).equals("GET")) {
                        HtmlRequest myRequest = new HtmlRequest(resultString);
                        caller.push(myRequest);
                    } else {
                        caller.push(WebsocketProtocol.decrypt(result, totalRead));
                    }
                }

                System.out.println(getName()+": total read -> "+totalRead);
            }
        }catch(SocketException e){
            System.out.println(getName() + ": SocketException "+e.getMessage());
        } catch (IOException ex) {
            System.out.println(getName() + ": IOException "+ex.getMessage());
        } catch (NullPointerException ex){
            System.out.println(getName() + ": NullPointerException "+ex.getMessage());
        } catch (Exception e) {
            System.out.println(getName() + ": Exception "+e.getMessage());
        }
    }

websocket协议代码:

public static byte[] decrypt(byte[] leido, int largo) {
    byte rLength = 0;
    int rMaskIndex = 2;
    int rDataStart = 0;

    byte data = leido[1];
    byte op = (byte) 127;
    rLength = (byte) (data & op);

    if (rLength == (byte) 126) {
        rMaskIndex = 4;
    }
    if (rLength == (byte) 127) {
        rMaskIndex = 10;
    }

    byte[] masks = new byte[4];

    int j = 0;
    int i = 0;
    for (i = rMaskIndex; i < (rMaskIndex + 4); i++) {
        masks[j] = leido[i];
        j++;
    }

    rDataStart = rMaskIndex + 4;

    int messLen = largo - rDataStart;

    byte[] message = new byte[messLen];

    for (i = rDataStart, j = 0; i < largo; i++, j++) {
        message[j] = (byte) (leido[i] ^ masks[j % 4]);
    }
    return message;
}

public static byte[] encrypt(String message) {
    byte[] bytesContent = message.getBytes();

    int countFrames = 0;

    byte[] frame = new byte[10];

    frame[0] = (byte) 129;

    if (bytesContent.length <= 125) {
        frame[1] = (byte) bytesContent.length;
        countFrames = 2;

    } else if (bytesContent.length > 125 && bytesContent.length <= 65535) {
        frame[1] = (byte) 126;
        int largo = bytesContent.length;
        frame[2] = (byte) ((largo >> 8) & (byte) 255);
        frame[3] = (byte) (largo & (byte) 255);
        countFrames = 4;
    } else {
        frame[1] = (byte) 127;
        int largo = bytesContent.length;
        frame[2] = (byte) ((largo >> 56) & (byte) 255);
        frame[3] = (byte) ((largo >> 48) & (byte) 255);
        frame[4] = (byte) ((largo >> 40) & (byte) 255);
        frame[5] = (byte) ((largo >> 32) & (byte) 255);
        frame[6] = (byte) ((largo >> 24) & (byte) 255);
        frame[7] = (byte) ((largo >> 16) & (byte) 255);
        frame[8] = (byte) ((largo >> 8) & (byte) 255);
        frame[9] = (byte) (largo & (byte) 255);
        countFrames = 10;
    }

    byte[] answer = new byte[countFrames + bytesContent.length];

    int currentPosition = 0;
    for (int i = 0; i < countFrames; i++) {
        answer[currentPosition] = frame[i];
        currentPosition++;
    }
    for (int i = 0; i < bytesContent.length; i++) {
        answer[currentPosition] = bytesContent[i];
        currentPosition++;
    }
    return answer;
}

【问题讨论】:

  • 我没有检查你的代码位,这可能是一个并发问题,你不觉得吗?
  • 我曾经这么认为,但是,我必须在 Windows 7(32 位)上发现同样的问题。或者,当我用 netbeans 执行应用程序时......不是这样的。它必须是有平台的东西......我认为
  • 我不是 netbeans 专家,但也许您可以将代码作为调试模式或实际执行模式执行?
  • 两种情况都有效。执行 jar 文件时出现问题。 (发布)。调用 java -jar file.jar
  • 奇怪的是read()方法返回-1但是socket没有关闭...理论上read()方法必须阻塞线程但它不会。

标签: javascript sockets windows-7-x64 java-websocket


【解决方案1】:

看起来失败是关于 Windows 7 上 JVM 上的默认字符集。

通话中

call java -jar filename.jar

你必须添加

call java -Dfile.encoding=UTF-8 -jar filename.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2011-10-30
    • 2011-12-08
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多