首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ServerSocket WebSocket回复

Java ServerSocket WebSocket回复
EN

Stack Overflow用户
提问于 2011-07-15 17:55:15
回答 2查看 1K关注 0票数 1

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

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

代码语言:javascript
复制
(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()命令添加的内容)。括号中的数字是以字节为单位的行的长度。

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

代码语言:javascript
复制
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的文章,假设这是我需要处理的协议的第一个版本,我一直在想如何处理商:

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

代码语言:javascript
复制
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()):

代码语言:javascript
复制
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;

然后,在其他地方:

代码语言:javascript
复制
out.println(replyHandshake());

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

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-15 03:51:39

如果您现在从头开始为自己实现一台服务器,那么我的目标是该协议的最新版本(版本8,草案10)。

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-12-16 03:33:42

您还可以使用名为MINA的Apache库,它有一个用于creating web sockets的库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6705340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档