在Java上编写WebSocket服务器.Windows 7 64位上的问题
Writing WebSocket Server on Java. Issue on Windows 7 64 bits
我在WebSocket协议方面遇到问题。
当我在开发时执行代码(NetBeans)并且工作正常时,即使我执行jar文件也仍然工作,但是。。。当我在Windows764位平台上执行jar时。。。WebSocket自行关闭。
我在本地机器上工作,包括服务器和客户端,即使我停用了windows防火墙,也没有任何变化。
即使我用三种浏览器(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上JVM上的默认字符集。
在呼叫中
call java -jar filename.jar
你必须添加
call java -Dfile.encoding=UTF-8 -jar filename.jar
相关文章:
- 有没有办法在里面看到一个数字'的64位浮点IEEE754表示
- firefox扩展,在32位和/或64位firefox(版本25.0.1)上使用js-cypes
- 将64位整数转换为json编码对象中的字符串的最佳实践
- 对象不支持此属性或方法 Rails Windows 64 位
- jQuery 错误 SCRIPT5002:IE9 64 位中预期的函数
- Javascript 十进制到二进制 - 64 位
- 如何使用 JavaScript 知道安装的 JVM 是 32 位还是 64 位
- 检测 Chrome 浏览器安装版本是否为 64 位
- 使用 javascript/css 将 64 位字符串转换为 jpeg
- breezejs :在 ODATA URL 中传递 64 位过滤器
- JavaScript-将基于64位数据的字符串转换为图像
- window.open无法在IE 9、64位操作系统中工作
- 无法使用节点预处理程序重建串行端口:404状态代码下载64位nw.lib
- 在Ubuntu 64位上安装js yaml NPM包依赖程序时出现问题
- JavaScript:64位对数字的影响
- Javascript/PHP将64位整数解释为浮点
- 更新Windows 7 64位的node.js
- Node.js服务器赢得't在windows 7 64位上启动
- 无法在Windows 7/64位启动express应用程序
- 在Java上编写WebSocket服务器.Windows 7 64位上的问题