标签: java-websocket

带有websockets的多线程

这更像是一个设计问题.我有以下实现

多个客户端连接----->服务器------>对应的DB conns

客户端/服务器通信使用Web套接字完成.它目前是一个单线程应用程序.显然,这种设计不会扩展,因为服务器上的负载太高,并且响应客户端的响应时间太长.后端操作涉及处理大量数据.

我的问题:为每个Web套接字连接创建一个新线程是个好主意吗?这意味着500个客户端有500个线程(无论是多线程还是单线程,Web套接字的数量都是相同的).这样可以减轻服务器的负担,从而使生活更轻松.

要么

是否有更好的逻辑来实现可扩展性?其中一个可以根据作业的优点创建线程,并由主线程处理其余部分.这在某种程度上似乎将来会再次回到同样的问题.

这里的任何帮助将不胜感激.

java multithreading tomcat java-websocket

4
推荐指数
1
解决办法
7914
查看次数

如何检查 Websocket 连接是否有效

我有一个到服务器的 websocket 连接:

import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

@ClientEndpoint
public class WebsocketExample {

    private Session userSession;

    private void connect() {

        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            container.connectToServer(this, new URI("someaddress"));
        } catch (DeploymentException | URISyntaxException | IOException e) {
            e.printStackTrace();
        }
    }

    @OnOpen
    public void onOpen(Session userSession) {
        // Set the user session
        this.userSession = userSession;
        System.out.println("Open");
    }

    @OnClose
    public void onClose(Session userSession, CloseReason reason) {
        this.userSession = null;
        System.out.println("Close");
    }

    @OnMessage
    public void onMessage(String message) {
        // …
Run Code Online (Sandbox Code Playgroud)

java websocket java-websocket

4
推荐指数
1
解决办法
1万
查看次数

websocket从服务器向所有客户端发送消息

我想向所有活跃的客户发送消息.

@OnMessage
public void onMessage(String message, Session session) {
    switch (message) {
    case "latencyEqualize":

        for (Session otherSession : session.getOpenSessions()) {
            RemoteEndpoint.Basic other = otherSession.getBasicRemote();
            String data = "Max latency = "
                    + LatencyEqualizer.getMaxLatency(latencies);            
            try {
                other.sendText(data);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        break;
    default:

        RemoteEndpoint.Basic other = session.getBasicRemote();          
        try {
            other.sendText(message);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码出了点问题.当我从第一个客户端发送消息"latencyEqualize"时,服务器只响应同一个客户端.其他客户端不会收到"Max latency = 15"消息.但是当第二个客户端向服务器发送任何消息时,他收到"最大延迟= 15".以后对服务器的所有呼叫都会从之前的呼叫中返回消息.

有没有办法避免这种情况.我希望所有客户端在其中一个客户端向服务器发送"latencyEqualize"消息时收到"Max latency"消息.

java java-websocket

3
推荐指数
1
解决办法
4022
查看次数

Spring Boot WebSocket Rabbitmq Stomp Broker不保持连接

找不到与此特定错误相关的任何其他问题.

我似乎无法用RabbitMQ连接我的Spring Boot WebSocket演示项目.请注意,使用"简单"代理时一切正常,但是当使用Rabbit连接stomp代理时,我收到以下错误(继续尝试重新连接):

Java HotSpot(TM) Client VM warning: You have loaded library /tmp/libnetty-transport-native-epoll8916930274033685449.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
2016-03-07 22:35:13.993  INFO 4047 --- [           main] o.s.m.s.s.StompBrokerRelayMessageHandler : Started.
2016-03-07 22:35:14.045  INFO 4047 --- [eactor-tcp-io-1] r.io.net.impl.netty.tcp.NettyTcpClient   : CONNECTED: [id: 0x034a269f, /127.0.0.1:39955 => /127.0.0.1:25672]
2016-03-07 22:35:14.151  INFO 4047 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer …
Run Code Online (Sandbox Code Playgroud)

rabbitmq spring-boot spring-websocket java-websocket spring-rabbitmq

3
推荐指数
1
解决办法
2311
查看次数

在运行时从后端 java 类连接到 Web-Socket-Server

我已经使用 spring 实现了以下 Web-Socket-Server。我们不想使用 STOMP 和 JSocks。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(new WebSocketServerHandler(), "/websocket/user/{userId}");
  }

}




@Service
public class WebSocketServerHandler extends TextWebSocketHandler {

   private List<WebSocketSession> sessions = new ArrayList<WebSocketSession>();

   @Override
   public void handleTextMessage(WebSocketSession session, TextMessage message)
        throws Exception {

        session.sendMessage(message);           
   }

   @Override
   public void afterConnectionEstablished(WebSocketSession session) throws Exception {
     sessions.add(session);
   }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
      sessions = null;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我可以从前端客户端(浏览器)成功连接到该 Web-Socket-Server。现在我想在运行时从我的一些 java 类连接到那个 Web-Socket-Server,然后想向那个 …

java spring-websocket java-websocket

3
推荐指数
1
解决办法
2255
查看次数

Websockets vs HTTP Rest用于实时应用程序

我正在开发实时Java应用程序的后端,使用Hibernate进行数据建模,我想提供一个API来提供客户端,可以是网页,移动应用程序甚至是桌面应用程序.服务器偶尔由RTU更新,可能每隔几分钟只更新一次或两次,但我希望服务器通知客户每次实时更改.所以我对websockets做了一些研究,似乎对它的使用有一些争议.由于我的应用程序不会有大量从服务器到客户端的非请求流量,我不知道使用websockets是否是最佳解决方案.但另一方面,如果我使用REST服务,我将需要一些解决方法来确保客户端接收服务器中产生的每个更改.在这种情况下,我可以面对使用websockets开发此应用程序的问题?它们是最好的方法吗?

编辑:websocket与rest API之间的区别对于实时数据?post和mine它是从服务器到客户端的未请求流量的速率将是最小的,因为两个服务器更新之间可能会传递几分钟.据我所知,对于那些需要不断更新服务器的应用程序来说,websockets是一个很好的选择,如在线游戏,但在我的情况下,我不知道使用它的缺点是否会超过专业人士.这文章让我怀疑有关使用我的应用程序的WebSockets的适用性

java rest websocket java-websocket

3
推荐指数
1
解决办法
1386
查看次数

限制对localhost的java-websocket访问

我正在编写一个java-websocket服务器作为加密货币客户端.

出于安全原因,我想限制对本地计算机的访问.

有没有办法通过IP或主机名限制对java-websocket服务器的访问?

如果是这样,怎么样?

java localhost restrict java-websocket

2
推荐指数
1
解决办法
784
查看次数

java-websocket的WebSocketServer使用什么草稿?

我无法从WebSocketServer.java中找出它使用的草稿.

WebSocketClient.java可以使用RFC 6455,Hybi 17,Hybi 10,Hixie 76和Hixie 75,但默认为RFC 6455.

java-websocket的WebSocketServer使用什么草稿?

java websocket java-websocket

2
推荐指数
1
解决办法
4012
查看次数

如何使用上下文路径将 WebSocketServlet 添加到嵌入式 Jetty 服务器?

我正在尝试在我正在处理的嵌入式 Jetty 应用程序中测试 WebSocket 支持。我的目标是将数据从服务器流式传输到浏览器。我还没有解决所有问题,因为我刚刚开始设置 WebSocket servlet/处理程序。

我看到的问题是 Chrome 无法连接到 WebSocket 处理程序:

WebSocket 连接到“ws://127.0.0.1:8081/stream”失败:WebSocket 握手期间出错:意外响应代码:404(匿名)@ ws-test.js:1

HTTP 404 来自 Jetty,因为它没有向“/stream”注册任何内容。

在我的一生中,我无法弄清楚如何使用指定的 URL 设置 WebSocketServlet 或 WebSocketHandler。我已经阅读了我能找到的所有示例和教程,但其中很多不是嵌入式 Jetty,或者是旧的。在任何一种情况下,我都愿意犯错。

我将从一些代码开始。这是我的服务器上下文和处理程序的主要 Jetty 设置:

ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setWelcomeFiles(new String[] { "index.htm" });
resource_handler.setResourceBase('./www');

ServletHandler servletHandler = new ServletHandler();

HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, servletHandler, new DefaultHandler() });
server.setHandler(handlers);

// Add the /test servlet mapping
servletHandler.addServletWithMapping(TestServlet.class, "/test/*");

// Add websocket handler
handlers.addHandler(StreamingHandler.getServlet("/stream"));            
server.start();
Run Code Online (Sandbox Code Playgroud)

这是我的 StreamingHandler 类,它扩展了 WebSocketHandler。请注意,我正在尝试设置 WebSocketHandler 的上下文路径。关键是让 …

javascript java jetty java-websocket

2
推荐指数
1
解决办法
1007
查看次数

如何在Java中关闭WebSocketContainer / WebSocketClient / Jetty客户端?

我正在尝试使用Jetty的WebSocket客户端,但是该应用程序只会卡在其中,并且不会退出。没什么好看的...

public class TestEndPoint extends Endpoint {
    private Session sess;

    public TestEndPoint(URI endpoint) throws Exception {

        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, endpoint);
    }

    public void close() {
        try {
            this.sess.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我将其连接到我的PHP Ratchet WS,没什么特别的,没有特别的逻辑,我只是open在客户端连接和close客户端断开连接时打印出来。

然后我像这样运行它:

public static void main(String[] args) {
    try {
        TestEndPoint test = new TestEndPoint(new URI("ws://localhost:8080/test"));
        Thread.sleep(5000);
        test.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以看到我的WS将打印“ close”,但是Java应用程序将永远不会退出。所以我进行了一个线程转储,发现其中的jetty …

java jetty java-websocket

2
推荐指数
1
解决办法
1106
查看次数

Websocket 连接上的 Apache Camel 基于内容的路由

我有一个假设的场景:让 \xe2\x80\x99s 假装我有一个 Apache Camel Websocket 服务器,并且 I\xe2\x80\x99m 允许许多 Websocket 连接。每个客户端连接都需要与一个 ClientID 关联。ClientID 是由新连接通过 InitConnection json 消息获取的,其中 ClientID 是消息的成员。问题是:camel 是否可以将 websocket 实例与 ClientID 关联起来以执行基于内容的路由?

\n

apache-camel java-websocket

1
推荐指数
1
解决办法
1415
查看次数

访问 WebSocket @ServerEndpoint 中的 HttpServletRequest 属性

我需要访问HttpServletRequest属性以获取包含TLS 请求的证书数组的javax.servlet.request.X509CertificateX509Certificate

从 JAX-RSContainerRequestFilter我可以轻松地从ContainerRequestContext.getProperty(String property)方法中提取它,但是我找不到从 WebSocketSession或 中获取它的方法HandshakeRequest,从中我可以访问HttpSession实例但不能访问实例HttpServletRequest

注意:这不是Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint因为我需要访问HttpServletRequest(或等效于提取 TLS 证书),而不是HttpSession.

由于 WebSocket 是 HTTP 的超集,我想它应该是可能的,希望 Java 团队已经想到了一种访问 servlet 属性的方法,但我真的找不到。任何人都知道这是否可能?

java servlets websocket java-websocket jakarta-ee

1
推荐指数
1
解决办法
2287
查看次数

Vert.x Websocket客户端-400错误的请求

如何从Java Vertex连接Cex.IO Websocket API

问题是Vert.x不能像Node.JS那样为我提供仅与WsURI连接的方法。我必须指定端口和主机并获取HTTP 400 Bad Request异常。

使用Node.js,您可以:

var WebSocketClient = require('websocket').client;
var client = new WebSocketClient();
client.connect("wss://ws.cex.io/ws/");
Run Code Online (Sandbox Code Playgroud)

使用Vert.x,您必须做

int host = 443; // That's defaults
String host = "cex.io"; // Am I right by specifying this host?
HttpClient client = Vertx.vertx().createHttpClient();
client.websocket(port, host, "wss://ws.cex.io/ws/", ws -> { ...});
Run Code Online (Sandbox Code Playgroud)

java websocket vert.x java-websocket vertx-httpclient

0
推荐指数
1
解决办法
516
查看次数