【问题标题】:WebSockets production ready server in Java?Java中的WebSockets生产就绪服务器?
【发布时间】:2011-05-15 18:35:33
【问题描述】:

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

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

【问题讨论】:

    标签: java websocket


    【解决方案1】:

    接受的答案是 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());
        }
    }
    

    详细示例here.

    支持 Websocket 的 Web Container:

    【讨论】:

    • onbinary 丢失或不是 API 的一部分?
    【解决方案2】:

    对于 Java,请查看此 informative post。从那里复制粘贴:

    在这些选项中,我猜JettyResin是最成熟和稳定的。但是,最好自己进行测试。

    【讨论】:

    • Heh) 好的)因为 Jetty WebSockets(我可以相信它的实现)我接受了你的回答;)谢谢!;)
    【解决方案3】:

    Vert.x 选项也值得考虑。

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

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

    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);
            }
        });
    

    更多详情看这里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>
    

    这是一个示例 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();
    

    【讨论】:

    【解决方案4】:

    看看Bristleback Framework。它是常用 Java Websocket 服务器(如 Jetty、Netty 或 Tomcat)的高级覆盖。如果你喜欢 Spring Framework,你一定要试试 Bristleback!

    免责声明:我是 Bristleback 框架项目的贡献者。

    【讨论】:

    • 当然,该项目托管在GitHub,并获得了 LGPL 许可。
    【解决方案5】:

    Apache Tomcat 8.0 实现 WebSockets 1.1 API (JSR-356)。您甚至可以在安装后通过导航到示例文件夹来玩示例:有回声聊天和蛇游戏。

    【讨论】:

      【解决方案6】:

      码头

      过去一周我一直在思考如何制作 WebSocket 服务器。终于有工作了,希望这会有所帮助。它使用来自 Jetty (jars) 的库。

      文件 WebRTC_IceServer.java

      package com.evanstools;
      import org.eclipse.jetty.server.*;
      import org.eclipse.jetty.websocket.server.*;
      public class WebRTC_IceServer{
      public static void main(String[] args){
      try{
      ////////////////////////
      if(args.length == 0){
        System.out.printf("%s%n","WebRTC_IceServer [port]");
        return;
      }
      Server server = new Server(Integer.parseInt(args[0]));
      WebSocketHandler.Simple webSocketHandlerSimple = new WebSocketHandler.Simple(WebsocketPOJO.class);
      server.setHandler(webSocketHandlerSimple);
      server.start();
      server.join();
      ////////////////////////
      }catch(Exception w){w.printStackTrace();}
      }
      }
      

      文件 WebsocketPOJO.java

      package com.evanstools;
      import org.eclipse.jetty.websocket.api.annotations.*;
      import org.eclipse.jetty.websocket.api.Session;
      //The class must be not abstract and public.
      @WebSocket
      public class WebsocketPOJO{
      //Flags one method in the class as receiving the On Connect event.
      //Method must be public, not abstract, return void, and have a single Session parameter.
      @OnWebSocketConnect
      public void onWebSocketConnect(Session session){
          System.out.printf("%s%n","test client connected");
      }
      //Flags one method in the class as receiving the On Close event.
      //Method signature must be public, not abstract, and return void.
      //The method parameters:
      ////Session (optional)
      ////int closeCode (required)
      ////String closeReason (required)
      @OnWebSocketClose
      public void OnWebSocketClose(Session session,int closeCode,String closeReason){}
      //Flags up to 2 methods in the class as receiving On Message events.
      //You can have 1 method for TEXT messages, and 1 method for BINARY messages.
      //Method signature must be public, not abstract, and return void.
      //The method parameters for Text messages:
      ////Session (optional)
      ////String text (required)
      //The method parameters for Binary messages:
      ////Session (optional)
      ////byte buf[] (required)
      ////int offset (required)
      ////int length (required)
      @OnWebSocketMessage
      public void onWebSocketMessageString(Session session, String text){}
      //Flags one method in the class as receiving Error events from the WebSocket implementation.
      //Method signatures must be public, not abstract, and return void.
      //The method parameters:
      ////Session (optional)
      ////Throwable cause (required)
      //@OnWebSocketError
      //Flags one method in the class as receiving Frame events from the WebSocket implementation after they have been processed by any extensions declared during the Upgrade handshake.
      //Method signatures must be public, not abstract, and return void.
      //The method parameters:
      ////Session (optional)
      ///Frame (required)
      //The Frame received will be notified on this method, then be processed by Jetty, possibly resulting in another event, such as On Close, or On Message. Changes to the Frame will not be seen by Jetty.
      //@OnWebSocketFrame
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 2011-09-16
        • 2012-10-11
        • 2020-04-30
        • 2011-02-06
        • 2018-09-16
        • 1970-01-01
        相关资源
        最近更新 更多