Подтвердить что ты не робот

Готовый сервер для создания WebSockets в Java?

EDIT: удалена ссылка на С#, так как единственным принятым ответом является Java. Если кому-то нужна информация о реализации сервера websocket в С#, задайте новый вопрос.

Знаете ли вы, что "готовая к производству" среда для создания WebSockets Server в Java? Я нашел одну библиотеку http://nugget.codeplex.com/, но я не знал, как она стабильна и быстра.

4b9b3361

Ответ 1

Для Java ознакомьтесь с этим информативным сообщением. Скопируйте пасту оттуда:

Из этих параметров я думаю, что Jetty и Resin являются наиболее зрелыми и стабильными. Однако всегда полезно делать собственное тестирование.

Ответ 2

Принятый ответ 3 года, с недавним выпуском JEE7, теперь каждый веб-контейнер, реализующий servert 3.1, будет поддерживать websocket через стандартный API (javax.websocket).

Следующий код показывает пример реализации websocket с использованием JEE7:

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

Пример в деталях здесь.

Веб-контейнер, поддерживающий Websocket:

Ответ 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

Таким образом, можно написать собственный сервер WebSocket с помощью Vert.x, упаковать его как FatJar и запустить его самостоятельно.

Или вы можете вставлять Vert.x env. в вашем приложении и программно развертывать вашу вертикулу (которая реализует сервер ws).


Другой альтернативой является веб-сервер JBoss 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 Framework.

Ответ 5

Apache Tomcat 8.0 реализует API-интерфейс WebSockets 1.1 (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
}