gpt4 book ai didi

Java ServerSocket WebSocket 回复

转载 作者:行者123 更新时间:2023-11-30 05:01:05 27 4
gpt4 key购买 nike

我正在尝试使用 Java 创建自己的 WebSocket 服务器。

当我的客户端连接时,我收到以下请求:

(14): GET / HTTP/1.1
(18): Upgrade: WebSocket
(19): Connection: Upgrade
(20): Host: localhost:8483
(24): Origin: http://localhost
(45): Sec-WebSocket-Key1: P3$04 H85Zf# 9 9d a0 x10[
(34): Sec-WebSocket-Key2: 416393 2 560Y
(0):

(括号中的数字、方括号、冒号和其后的空格只是我为 System.out.println() 命令添加的内容)。括号中的数字是以字节为单位的行长度。

我首先使用此函数处理请求:

public boolean processHandshake(int lineNumber, String line){

if(handshakeProcessed || lineNumber > 9 || lineNumber < 1){

return false;

}

switch(lineNumber){

case 1:{ handshakeGetLocation = line.replace("GET ", "").replace(" HTTP/1.1", ""); break; }
case 2:{ handshakeUpgrade = line.replace("Upgrade: ", ""); break; }
case 3:{ handshakeConnection = line.replace("Connection: ", ""); break; }
case 4:{ handshakeHost = line.replace("Host: : ", ""); break; }
case 5:{ handshakeOrigin = line.replace("Origin: ", ""); break; }
case 6:{ handshakeSecWebSocketKey1 = line.replace("Sec-WebSocket-Key1: ", ""); break; }
case 7:{ handshakeSecWebSocketKey2 = line.replace("Sec-WebSocket-Key2: ", ""); handshakeProcessed = false; break; }
case 8:{ handshakeProcessed = true; }
case 9:{ handshakeProcessed = true; }

}

return true;

}

现在,根据 this文章并假设这是我需要处理的协议(protocol)的第一个版本,我一直想知道如何处理商:

问题是,对于每个键,我需要将位数除以空格数。我一直这样做:

private double calculateKeyReply(String key){

double numCount = key.replaceAll("[^0-9]", "").length();
double spaceCount = key.replaceAll("[^\\ ]", "").length();

System.out.println(numCount+"/"+spaceCount+"="+numCount/spaceCount);

return numCount/spaceCount;

}

并调用以下函数(replyHandshake()):

String handshake;

handshake = "HTTP/1.1 101 WebSocket Protocol Handshake\n";
handshake += "Upgrade: "+handshakeUpgrade+"\n"; // handshakeUpgrade and the following variables are instance variables I set when I process the request
handshake += "Connection: "+handshakeConnection+"\n";
handshake += "Sec-WebSocket-Origin: "+handshakeOrigin+"\n";
handshake += "Sec-WebSocket-Location: "+handshakeOrigin.replace("http", "ws")+handshakeGetLocation+"\n";
handshake += "Sec-WebSocket-Protocol: sample\n";
// handshake += "\n";

String nums = calculateKeyReply(handshakeSecWebSocketKey1)+""+calculateKeyReply(handshakeSecWebSocketKey2);

MessageDigest md5Digestor = MessageDigest.getInstance("MD5");
String md5 = new String(md5Digestor.digest(nums.getBytes()));

handshake += md5;

return handshake;

然后,在其他地方:

out.println(replyHandshake());

我做错了什么吗?我正在使用最新版本的 Google Chrome 对其进行测试。

提前致谢!

最佳答案

如果您今天加倍努力并从头开始为自己实现一个服务器,我会瞄准最新版本的协议(protocol)(版本 8,草案 10)。

上面的握手来自过时的版本。

Chrome 14 和 Firefox 7/8 支持最新版本。 Firefox 6 有一个(默认禁用)旧版本。 Chrome 很可能会放弃对任何版本 <8 的支持。

关于Java ServerSocket WebSocket 回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com