web-dev-qa-db-ja.com

JavaのWebSocketsプロダクション対応サーバー?

[〜#〜] edit [〜#〜]:受け入れられた唯一の答えはJavaに関するものであるため、C#への参照を削除しました。 C#でのWebSocketサーバーの実装に関する情報が必要な場合は、新しい質問をしてください。

JavaでWebSocketsサーバーを作成するための「プロダクションレディ」フレームワークを知っていますか?私は1つのライブラリ http://nugget.codeplex.com/ を見つけましたが、それがどのように安定していて高速かわかりませんでした。

28
Edward83

Javaの場合は、この 参考記事 を確認してください。そこからコピーして貼り付けます:

これらのオプションのうち、JettyResinが最も成熟していると思いますそして安定しています。ただし、常に独自のテストを行うことをお勧めします。

35
Neeme Praks

受け入れられた回答は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());
    }
}

詳細な例 ここ

WebsocketをサポートするWebコンテナー:

46
Pau Kiat Wee

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 envを埋め込むことができます。アプリで、バーティクル(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
aymens

Bristleback Framework を見てください。これは、Jetty、Netty、Tomcatなどの一般的に使用されるJava Websocketサーバーの高レベルのオーバーレイです。SpringFrameworkが好きな場合は、Bristlebackをぜひお試しください!

免責事項:私はBristleback Frameworkプロジェクトの寄稿者です。

2
voitec

桟橋

過去1週間、WebSocketサーバーの作成方法を詳しく説明しました。最後に、これが役立つことを願って動作するものを得ましたJetty(jar)のライブラリを使用します。

ファイル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
}
0
user28775

Apache Tomcat 8. はWebSockets 1.1 APIを実装します( JSR-356 )。インストール後、examplesフォルダーに移動してサンプルで遊ぶこともできます。エコーチャットとヘビゲームがあります。

0
timeking