服务器响应后关闭socket,java - 关闭websocket后收到“未收到握手响应。” - 堆栈内存溢出...

我正在使用tyrus websocket客户端(1.11)连接到websocket。

compile 'org.glassfish.tyrus:tyrus-client:1.+'

compile 'org.glassfish.tyrus:tyrus-container-grizzly-client:1.+'

我正在运行本地wscat服务器( wscat --listen )来测试我的连接。

我的客户要做的是,它连接到Websocket,发送文本字符串,然后发送二进制负载(0xb5,0xb2,0xb1,0xb0,0xb1,0xb2,0xc6),再输入另一个字符串,然后断开连接。

这是服务器看到的(也是我所期望的):

listening on port 8666 (press CTRL+C to quit)

client connected

< Ohai, Server!

< �������

< Bye, Server!

disconnected

注意 :进行连接的实体Monkey类扩展了Thread并异步运行,因此某些日志行可能会出现故障。

但是,在客户端,事情并不那么麻烦。 尽管日志同意建立连接,但发送了三个数据块,并且关闭了连接,但它也给了我一个堆栈跟踪信息,表明该连接失败是因为未收到握手响应 (请参见此处的完整日志):

...

[org.glassfish.tyrus.client.TyrusClientEngine] FINE: > Session af609b3f-2978-453f-9758-10351d5ed2af [43 ms]: Sending handshake request:

> GET ws://127.0.0.1:8666

> Connection: Upgrade

> Host: 127.0.0.1:8666

> Origin: 127.0.0.1:8666

> Sec-WebSocket-Key: pGNihDxLIbQqcxvMTBERSQ==

> Sec-WebSocket-Protocol: binary

> Sec-WebSocket-Version: 13

> Upgrade: websocket

[org.glassfish.tyrus.client.TyrusClientEngine] FINE: < Session af609b3f-2978-453f-9758-10351d5ed2af [324 ms]: Received handshake response:

< 101

< connection: Upgrade

< sec-websocket-accept: EZjq5dEOzWz2q46tKtNlVD8K+mk=

< sec-websocket-protocol: binary

< upgrade: websocket

...

[MONKEY_0] FINER: Session 'af609b3f-2978-453f-9758-10351d5ed2af' opened

[RUNNER] INFO: MONKEY_0 connected

[MONKEY_0] FINER: Sending messages...

[MONKEY_0] FINER: Saying Hi...

[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [335 ms]: Sending text message: Ohai, Server!

...

[MONKEY_0] FINER: Said Hi. Now Sending binary data...

[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [342 ms]: Sending binary message

[MONKEY_0] FINER: Binary sent. Saying Bye...

[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINEST: > Session af609b3f-2978-453f-9758-10351d5ed2af [344 ms]: Sending text message: Bye, Server!

[MONKEY_0] FINER: Messages sent.

[MONKEY_0] INFO: Closing socket.

[org.glassfish.tyrus.core.TyrusRemoteEndpoint] FINE: Close public void close(CloseReason cr): CloseReason[1000,Bye]

...

[MONKEY_0] FINER: Session 'af609b3f-2978-453f-9758-10351d5ed2af' closed (Bye)

[RUNNER] INFO: MONKEY_0 disconnected

[MONKEY_0] SEVERE: Unable to connect to 'ws://127.0.0.1:8666'

javax.websocket.DeploymentException: Handshake response not received.

at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:691)

at org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:712)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:866)

at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)

at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:511)

at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:373)

at com.redacted.webmonkey.monkey.Monkey.connect(Monkey.java:90)

at com.redacted.webmonkey.monkey.Monkey.run(Monkey.java:47)

Caused by: java.lang.InterruptedException

at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1039)

at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)

at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)

at org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:666)

... 9 more

...

[RUNNER] SEVERE: 'MONKEY_0' failed. Error: Cannot connect

...

为什么明显有第二次尝试连接? 这里发生了什么?

我添加了一些时间戳以查看实际情况:

Session s = null;

try {

LOG.d("(%d) attempting to connect", System.currentTimeMillis());

WebSocketContainer wsc = ContainerProvider.getWebSocketContainer();

s = wsc.connectToServer(this, uri);

LOG.d("(%d) Connected", System.currentTimeMillis());

} catch (Exception e) {

LOG.e("(%d) Unable to connect to '%s'", System.currentTimeMillis(), uri);

e.printStackTrace();

}

LOG.d("(%d) Session id : %s", System.currentTimeMillis(), s == null ? null : s.getId());

return s != null;

我实际上得到的提示是我无法连接(但是我确实已经发送了这些消息,不是吗?)

[MONKEY_0] FINER: (1441396510763) attempting to connect

[MONKEY_0] FINER: (1441396511068) Session '4c0b1f6e-de7e-471d-a801-f807895c4a0b' opened

[MONKEY_0] FINER: (1441396511079) Session '4c0b1f6e-de7e-471d-a801-f807895c4a0b' closed (Bye)

[MONKEY_0] SEVERE: (1441396511080) Unable to connect to 'ws://127.0.0.1:8666'

[MONKEY_0] FINER: (1441396511081) Session id : null

当我与ws进行交易时,似乎connect调用被阻止。 它是否假定由于连接在onOpen回调结束时关闭而发生错误?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值