Java中的WebSockets生产就绪服务器?

Edw*_*d83 28 java websocket

编辑:删除了对C#的引用,因为唯一接受的答案是关于Java.如果有人需要有关C#中websocket服务器实现的信息,请提出一个新问题.

您是否知道用Java创建WebSockets服务器的"生产就绪"框架?我找到了一个库http://nugget.codeplex.com/但我不知道它是如何稳定和快速的.

Pau*_*Wee 47

接受的答案是3年,随着最近发布的JEE7,现在每个实现servert 3.1的Web容器都将通过标准API(javax.websocket)包支持websocket .

以下代码显示了如何使用JEE7实现websocket的示例:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/chat")
public class ChatServer {

    private static final Logger LOGGER = 
            Logger.getLogger(ChatServer.class.getName());

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.log(Level.INFO, "New connection with client: {0}", 
                session.getId());
    }

    @OnMessage
    public String onMessage(String message, Session session) {
        LOGGER.log(Level.INFO, "New message from Client [{0}]: {1}", 
                new Object[] {session.getId(), message});
        return "Server received [" + message + "]";
    }

    @OnClose
    public void onClose(Session session) {
        LOGGER.log(Level.INFO, "Close connection for client: {0}", 
                session.getId());
    }

    @OnError
    public void onError(Throwable exception, Session session) {
        LOGGER.log(Level.INFO, "Error for client: {0}", session.getId());
    }
}
Run Code Online (Sandbox Code Playgroud)

这里详细说明.

支持Websocket的Web容器:


Nee*_*aks 35

对于Java,请查看这篇内容丰富的帖子.从那里复制粘贴:

在这些选项中,我猜JettyResin是最成熟和最稳定的.但是,总是很好地做自己的测试.


aym*_*ens 5

Vert.x 选项也值得考虑。

创建一个 ws 服务器可以很简单

vertx.websocketHandler(new Handler<ServerWebSocket>() {
    public void handle(ServerWebSocket ws) {
        // A WebSocket has connected!
    }
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

或者

vertx.createHttpServer().websocketHandler(new Handler<ServerWebSocket>() {
        @Override
        public void handle(final ServerWebSocket ws) {
            logger.info("ws connection established with " + ws.remoteAddress());
            ws.dataHandler(new Handler<Buffer>() {
                @Override
                public void handle(Buffer data) {
                    JsonObject item = new JsonObject(data.toString());
                    logger.info("data in -> " + item.encodePrettily());
                       // if you want to write something back in response to the client
                    //ws.writeTextFrame(...);
            }
            });
        }
    }).listen(port, new Handler<AsyncResult<HttpServer>>() {
        @Override
        public void handle(AsyncResult<HttpServer> event) {
            logger.info("ws server is up and listening on port " + port);
        }
    });
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见此处http://vertx.io/docs/vertx-core/java/#_websockets

所以可以用 Vert.x 编写自己的 WebSocket 服务器,将其打包为 FatJar,并自行运行。

或者您可以嵌入 Vert.x 环境。在您的应用程序中,并以编程方式部署您的 Verticle(实现 ws 服务器)。


另一种选择是 JBoss 的 Web 服务器 Undertow。这很容易嵌入到应用程序中。

添加这些依赖项:

<dependency>
  <groupId>io.undertow</groupId>
  <artifactId>undertow-servlet</artifactId>
  <version>${version.io.undertow}</version>
</dependency>

<dependency>
  <groupId>io.undertow</groupId>
  <artifactId>undertow-websockets-jsr</artifactId>
  <version>${version.io.undertow}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这是一个示例 ws 服务器:

Undertow server = Undertow.builder()
            .addHttpListener(8080, "localhost")
            .setHandler(path()
                    .addPrefixPath("/myapp", websocket(new WebSocketConnectionCallback() {

                        @Override
                        public void onConnect(WebSocketHttpExchange exchange, WebSocketChannel channel) {
                            channel.getReceiveSetter().set(new AbstractReceiveListener() {

                                @Override
                                protected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) {
                                    final String messageData = message.getData();
                                    for (WebSocketChannel session : channel.getPeerConnections()) {
                                        WebSockets.sendText(messageData, session, null);
                                    }
                                }
                            });
                            channel.resumeReceives();
                        }
                    }))
            .build();

    server.start();
Run Code Online (Sandbox Code Playgroud)