在Java中Websocket握手失败
所以,我试图解析一个使用websocket向客户端发送数据的网站。根据我所读到的:在Java中Websocket握手失败,java,websocket,handshake,Java,Websocket,Handshake,所以,我试图解析一个使用websocket向客户端发送数据的网站。根据我所读到的: 我知道为了创建连接,我需要向服务器发送一个特殊的http请求,ot将检索一些我用来访问通道的数据 我所做的: 创建了http请求 `URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMetho
- 创建了http请求
``URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); //add request header con.setRequestProperty("Cache-Control", "no-cache"); con.setRequestProperty("Host", "www.example.com"); con.setRequestProperty("Upgrade", "websocket"); con.setRequestProperty("Connection", "upgrade"); con.setRequestProperty("Origin", "https://example.com"); con.setRequestProperty("Sec-WebSocket-Extensions", "x-webkit-deflate-frame"); con.setRequestProperty("Sec-WebSocket-Key", "QkWkChtTGpaZL5PkOMaRtg=="); con.setRequestProperty("Sec-WebSocket-Version", "13"); con.setRequestProperty("User-Agent", "Mozilla/..;
- 在此之后,我尝试将客户端连接到服务器,并使用onMessage方法接收消息
WebSocketContainer=ContainerProvider.getWebSocketContainer(); Session Session=container.connectToServer(ClientEndpoint.class,buildCEC(),新URI(“wss://async.example.com/socket.io/1/?t=“+System.currentTimeMillis())代码>
- 我尝试在buildCec()中插入到服务器连接的头。
ClientEndpointConfig config=ClientEndpointConfig.Builder.create().build(); Configurator conf=config.getConfigurator();
`Map headers=newhashmap(); headers.put(“连接”、Arrays.asList(“保持活动”、“升级”); headers.put(“Sec Websocket扩展”,Arrays.asList(“x-webkit-deflate-frame”); headers.put(“Sec Websocket键”,Arrays.asList(“cx36sHrtuW9HZAaB6kKa/Q==”); headers.put(“Sec Websocket版本”,Arrays.asList(“13”); headers.put(“升级”,Arrays.asList(“websocket”); headers.put(“用户代理”、Arrays.asList(“Mozill…”); conf.beforeRequest(标题); 返回配置`
Sec WebSocket键
,它有一个总体目的,即让客户端证明它从服务器收到了有效的密钥。客户端有规则,服务器端有规则,它应该如何处理它,以及如何响应它。(简言之,它是一个随机值,客户机拾取并发送给服务器,服务器在此步骤中附加RFC指定的GUID,计算SHA-1散列,并在其自己的Sec WebSocket Key
中使用该散列进行响应,客户机验证该散列以确认服务器确实具有WebSocket功能)
org.eclipse.jetty.websocket
org.apache.tomcat
org.glassfish.grizzly
org.glassfish.tyrus.bundles
(每一个编写针对这个测试套件的实现测试的人,它有点成为事实上的协议验证套件)我认为以下是您需要的:
String secAccept = sha1base64(secKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
private String sha1base64(String str) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return Base64.encode(md.digest(str.getBytes()));
}
我认为使用一些客户端库会更容易。谷歌搜索:我想先了解他们创建WebSocket概念的基础知识,然后再使用一个库。不管怎样,我还是要看一看。将来,你可能会想把这么多的主题问题分成几个单独的问题。谢谢你这么详细的回答。我会回顾你告诉我的,并让你知道。你好,我再次阅读了你给我的所有内容,我已经实现了一个小例子,但现在我想解析真实的站点。我使用了Jetty客户端,一开始一切似乎都正常,握手会给出200个状态码和所有信息。但当我尝试建立连接时,它仍处于挂起状态。我要分析的站点使用以下内容:。我遵循了本文档中的所有步骤,但运气不佳。当尝试建立真正的连接时,它仍处于挂起状态。你知道服务器有某种接受吗?它适用于“ws://echo.websocket.org”,更具体地说,当我说接受时,我指的是某种标题。你的问题似乎是一长串“…哦,还有另一件事…”。IO不是websocket,它是websocket顶部的一个复杂层。你的问题是关于websocket的。就这个新问题再问一个问题。不要沾沾自喜地回答老问题。Stackoverflow不是一个持续对话的论坛,它是一个问答网站。
String secAccept = sha1base64(secKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
private String sha1base64(String str) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return Base64.encode(md.digest(str.getBytes()));
}