Tag: websocket

Java WebSockets:远程端点处于状态

我正在尝试实现一些基于websockets的应用程序,它将与JS客户端密切沟通。 发送消息的代码非常原始: synchronized (session) { if (session.isOpen()) { session.getBasicRemote().sendText(message); } } 对于罕见的发送,它工作正常,但当几个线程试图通过相同的会话(套接字)发送一些消息时,抛出下一个exception(请注意,它不是multithreading问题,因为代码块是通过会话同步的): java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1015) at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:978) at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:161) at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37) 谷歌目前并没有这种类型的例外,在这个问题上打了几个小时后,仍然没有解决方案。 Java 7.0.21,在Tomcat 7.0.52和Tomcat 8.0.3上测试。 任何答案都非常感谢! 提前致谢。 更新3/11/2014:我使用Jetty 9.1测试了我的应用程序,但没有发生此exception。 我假设这是Tomcat实现错误。

WebSockets – 创建渠道和推送数据的正确方法

我有一个场景,我想通知我的网站用户,有人评论了他们也评论过的文章。 这有点像当有人回答问题时SO通知我的方式! 服务器端,我坚持评论,然后查找评论同一篇文章的所有用户。 然后我播出(我正在使用Atmosphere): PushContext pushContext = PushContextFactory.getDefault().getPushContext(); for(User u : users){ // channel name, message pushContext.push(“/user_” + u.id, “someone commented! blah blah”); } 我正在广播的“频道”是用户的“自己的”频道,因为我不希望每个用户都收到通知。 我在频道名称中使用用户ID来实现此目的。 这是确保只有相关用户得到通知的正确方法吗? 我想我还想再做两件事: 只推送我认为仍然在线的用户。 如果他们不在线,则浪费资源推动他们。 加密邮件,因为否则任何人都可以收听我的邮件,如果他们知道我的用户ID。 还有什么我需要考虑的吗?

Java中的简单Websocket客户端 – 连接问题

我正在尝试用Java编写一个简单的websocket客户端来连接第三方WebSocket服务器(我无法访问服务器)。 我可以在浏览器中使用javascript连接和与websocket服务器通信,但是当我尝试使用Java客户端做同样的事情时,它无法连接。 使用相同的Java客户端,我可以连接到我运行的tomcat websocket服务器,所以我认为这是客户端和服务器之间的某种兼容性问题。 (我正在使用Tomcat 7.0.56库作为websocket客户端)。 这是我得到的错误…… 错误 javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection failed at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:344) at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:166) at com.cvr.instant.ws.WebSocketClient.Connect(WebSocketClient.java:44) at com.cvr.instant.ws.TestWS.Start(TestWS.java:17) at com.cvr.instant.ws.TestWS.main(TestWS.java:37) Caused by: java.io.EOFException at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:595) at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:317) … 4 more WebSocketClient import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import javax.websocket.ClientEndpoint; import javax.websocket.CloseReason; import javax.websocket.ContainerProvider; import javax.websocket.DeploymentException; import javax.websocket.OnClose; […]

Jetty 8.1.1 Websocket客户端握手

我正在使用Jetty 8.1.1 Websocket客户端API。 我需要用(“Sec-WebSocket-Protocol”, “xsCrossfire”)和(“Authorization”, “Basic TLVWQMZqRr2hasYnZoI=”)更新标题 WebSocketClientFactory factory = new WebSocketClientFactory(); factory.start(); client = factory.newWebSocketClient(); client.getCookies().put(“Sec-WebSocket-Protocol”, “xsCrossfire”); client.getCookies().put(“Authorization”, “Basic TLVWQMZqRr2hasYnZoI=”); Future conn = client.open(uri, (WebSocket) this); System.out.printf(“Connecting to : %s%n”, uri); 请求看起来: Host: iltlvl262:8000\r\n Upgrade: websocket\r\n Connection: Upgrade\r\n Sec-WebSocket-Version: 13\r\n Sec-WebSocket-Key: FHKTsICO2vqGCxXVwLkH4Q==\r\n Cookie: Sec-WebSocket-Protocol=xsCrossfire\r\n Cookie: Authorization=”Basic TLVWQMZqRr2hasYnZoI=”\r\n 预期要求: Host: iltlvl262:8000\r\n Upgrade: websocket\r\n Connection: Upgrade\r\n […]

Dispatcher-servlet无法映射到websocket请求

我正在开发一个以Web为主框架的Java webapp(Spring核心,Spring mvc,Spring安全,Spring数据,Spring websocket特别使用)。 在这样的Spring上下文中声明一个消息代理,为上下文提供了一个SimpMessagingTemplate bean: 我必须将此标记放在我的根上下文(applicationContext.xml)中,否则在该根上下文中声明的服务不能通过websocket向用户发送通知(因为它们需要SimpMessagingTemplate)。 问题是,如果我将此标记放在根上下文中,客户端在订阅websocket时会获得404。 如果我将标记放在dispatcher-servlet中,那么根上下文中的服务就不能发送通知,因为它们需要SimpMessagingTemplate(但它只能在子dispatcher-servlet上下文中使用)。 有没有办法将调度程序-servlet“绑定”到代理? 两次声明bean不是一个正确的解决方案。 这个问题和Spring一样:如何将SimpMessagingTemplate bean暴露给root上下文? 但从另一个角度看(在根上下文中而不是在dispatcher-servlet中声明websocket)

最小的java8 nio安全websocket客户端(wss)

我花了很长时间才找到简单的java websocket客户端,可以使用wss并且不会乱七八糟…… 我试过https://github.com/TooTallNate/Java-WebSocket 添加依赖,因为他说,复制SSLClientExample.java用websocket.org echo服务器测试它,但在第84行得到编译错误没有这样的方法setSocket()…(卡在这里) 我试过tyrus(似乎这是一个由oracle直接开发的大型库)但似乎我需要运行一些appserver(websocket容器)才能使用它… 我想知道对于那些需要有netty或glassfish或grizly的websockets来说这么困难吗? 我认为可以使用SSLEngine(wss)和纯java sdk实现一个…有什么我不知道websockets? (我想它非常像普通的sockets)

Websocket:在页面重新加载后维护用户会话

我有一个简单的单页应用程序,使用jetty websockets进行服务器和客户端之间的通信。 问题:每次重新加载页面时,我的websocket连接都被禁用,并且new被初始化。 问题是用户应该重新刷新每个页面刷新。 问题: 如何在页面刷新时消除重新登录的需要? 编辑:面临下一个问题 :如何决定何时删除会话? 我在服务器端有一个对等对象,除了websocket会话容器之外别无其他。 在onClose方法上删除Peer,而onClose方法又在droping客户端websocket上调用。 这里的问题来了:当用户按F5 – >客户端websocket被破坏 – >服务器删除相应的websocket – >客户端尝试重新加载页面并检查是否有任何会话和找不到。 另一方面,我根本不能停止删除同伴(会话)。 问题:如何告诉服务器何时删除我的同行?

Websocket握手在Java中失败

所以,我正在尝试解析一个使用websocket向客户端发送数据的网站。 从我读过的内容: 链接1 链接2 我知道,为了创建连接,我需要向服务器发送一个特殊的http请求,然后我将检索一些用于访问该通道的数据。 我做了什么: 创建了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/..; ` 我用代码200(不应该是101)读取响应。 问题: 我如何生成Sec-Websocket-Key? (例如从firebug中获取,实际上所有头文件) 1.1。 还有什么可以做的? 1.2。 必须使用http中的相同链接来访问websocket? 只用wss而不是https? 在此之后,我尝试将客户端连接到服务器并在onMessage方法中接收消息。 […]

Jetty WebSocket api与标准JSR 356 API相比

Jetty 9支持它自己的Jetty Websocket API以及标准的JSR 356 API,因为我认为是历史原因(Jetty的API 在 最终的JSR 356 之前 )。 我查看了两个API的基本文档,以及一些示例。 两个API看起来都相当完整且非常相似。 但是,我需要为我正在编写的新项目选择一个而不是另一个,我希望避免使用可能在将来被弃用的API,或者可能会变得function不足。 那么两者之间是否有任何重要的区别,除了一个标准化的明显事实?

Spring 4 MVC和Websockets – 没有合适的默认RequestUpgradeStrategy

我需要Websockets在我的应用程序中进行实时更新。 所以我找到了这个例子,并在这里一步一步地做到了 。 我完成了教程,最后在启动应用程序时遇到了这个exception: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.web.socket.server.support.DefaultHandshakeHandler#0’:bean的实例化失败; 嵌套exception是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.web.socket.server.support.DefaultHandshakeHandler]:构造函数抛出exception; 嵌套exception是java.lang.IllegalStateException:找不到合适的默认RequestUpgradeStrategy 我搜索了很多,但我找不到解决方案。 我希望有人可以帮助我,提前谢谢。 最好的问候,帕特里克