这更像是一个设计问题.我有以下实现
多个客户端连接----->服务器------>对应的DB conns
客户端/服务器通信使用Web套接字完成.它目前是一个单线程应用程序.显然,这种设计不会扩展,因为服务器上的负载太高,并且响应客户端的响应时间太长.后端操作涉及处理大量数据.
我的问题:为每个Web套接字连接创建一个新线程是个好主意吗?这意味着500个客户端有500个线程(无论是多线程还是单线程,Web套接字的数量都是相同的).这样可以减轻服务器的负担,从而使生活更轻松.
要么
是否有更好的逻辑来实现可扩展性?其中一个可以根据作业的优点创建线程,并由主线程处理其余部分.这在某种程度上似乎将来会再次回到同样的问题.
这里的任何帮助将不胜感激.
我有一个到服务器的 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) 我想向所有活跃的客户发送消息.
@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"消息.
找不到与此特定错误相关的任何其他问题.
我似乎无法用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
我已经使用 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应用程序的后端,使用Hibernate进行数据建模,我想提供一个API来提供客户端,可以是网页,移动应用程序甚至是桌面应用程序.服务器偶尔由RTU更新,可能每隔几分钟只更新一次或两次,但我希望服务器通知客户每次实时更改.所以我对websockets做了一些研究,似乎对它的使用有一些争议.由于我的应用程序不会有大量从服务器到客户端的非请求流量,我不知道使用websockets是否是最佳解决方案.但另一方面,如果我使用REST服务,我将需要一些解决方法来确保客户端接收服务器中产生的每个更改.在这种情况下,我可以面对使用websockets开发此应用程序的问题?它们是最好的方法吗?
编辑:websocket与rest API之间的区别对于实时数据?post和mine它是从服务器到客户端的未请求流量的速率将是最小的,因为两个服务器更新之间可能会传递几分钟.据我所知,对于那些需要不断更新服务器的应用程序来说,websockets是一个很好的选择,如在线游戏,但在我的情况下,我不知道使用它的缺点是否会超过专业人士.这文章让我怀疑有关使用我的应用程序的WebSockets的适用性
我正在编写一个java-websocket服务器作为加密货币客户端.
出于安全原因,我想限制对本地计算机的访问.
有没有办法通过IP或主机名限制对java-websocket服务器的访问?
如果是这样,怎么样?
我无法从WebSocketServer.java中找出它使用的草稿.
WebSocketClient.java可以使用RFC 6455,Hybi 17,Hybi 10,Hixie 76和Hixie 75,但默认为RFC 6455.
java-websocket的WebSocketServer使用什么草稿?
我正在尝试在我正在处理的嵌入式 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 的上下文路径。关键是让 …
我正在尝试使用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 …
我有一个假设的场景:让 \xe2\x80\x99s 假装我有一个 Apache Camel Websocket 服务器,并且 I\xe2\x80\x99m 允许许多 Websocket 连接。每个客户端连接都需要与一个 ClientID 关联。ClientID 是由新连接通过 InitConnection json 消息获取的,其中 ClientID 是消息的成员。问题是:camel 是否可以将 websocket 实例与 ClientID 关联起来以执行基于内容的路由?
\n我需要访问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 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 ×13
java ×11
websocket ×5
jetty ×2
apache-camel ×1
jakarta-ee ×1
javascript ×1
localhost ×1
rabbitmq ×1
rest ×1
restrict ×1
servlets ×1
spring-boot ×1
tomcat ×1
vert.x ×1