2013-03-26 19 views
12

これはおそらく明白ですが、私はこのパラダイムが初めてです。 Jetty Serverを作成し、websocketクラスを次のように登録します。Jetty 9でインスタンス化されたWebSocketにアクセスするにはどうすればよいですか?

 Server server = new Server(8080); 
     WebSocketHandler wsHandler = new WebSocketHandler() 
     { 
      @Override 
      public void configure(WebSocketServletFactory factory) 
      { 
       factory.register(MyEchoSocket.class); 
      } 
     }; 
     server.setHandler(wsHandler); 

websocketはメッセージを正常に受信します。私は、クライアントからのメッセージを最初に受信しなくても、サーバからメッセージを送信できるようにしたいと思います。接続が開かれたときに作成されたMyEchoSocketインスタンスにアクセスするにはどうすればよいですか?または、より一般的には、MyEchoSocketのonTextメソッド以外のソケットでメッセージを送信するにはどうすればよいですか?

+0

これはまさにサーバーではありません。誰かに応答していない限り、あなたが接続している相手がわからないので、その時点から送信を開始するのは意味がありません。 –

+0

私がWebSocketsを使っている理由は、サーバー側からプッシュしたい状況に適していると思ったからです。 MyEchoSocketは、onConnect()メソッドを使用してWebSocketConnectionを追跡することができます。プログラムが実行されるとMyEchoSocketのインスタンスにアクセスする方法はわかりません。 –

+0

あなたは誰にプッシュしようとしていますか?誰かがあなたに接続した後であれば、プッシュを行うために非同期ハンドラを生成することができます。 –

答えて

27

2つの一般的な手法が、ここでは非常に単純化されたチャットルームの概念で示されています。

オプション#1:次に、単にあなたの好みのWebSocketをと話をする中央の場所を使用し

@WebSocket 
public class ChatSocket { 
    public Session session; 

    @OnWebSocketConnect 
    public void onConnect(Session session) { 
     this.session = session; 
     ChatRoom.getInstance().join(this); 
    } 

    @OnWebSocketMessage 
    public void onText(String message) { 
     ChatRoom.getInstance().writeAllMembers("Hello all"); 
    } 

    @OnWebSocketClose 
    public void onClose(int statusCode, String reason) { 
     ChatRoom.getInstance().part(this); 
    } 
} 

public class ChatRoom { 
    private static final ChatRoom INSTANCE = new ChatRoom(); 

    public static ChatRoom getInstance() 
    { 
     return INSTANCE; 
    } 

    private List<ChatSocket> members = new ArrayList<>(); 

    public void join(ChatSocket socket) 
    { 
     members.add(socket); 
    } 

    public void part(ChatSocket socket) 
    { 
     members.remove(socket); 
    } 

    public void writeAllMembers(String message) 
    { 
     for(ChatSocket member: members) 
     { 
      member.session.getRemote().sendStringByFuture(message); 
     } 
    } 

    public void writeSpecificMember(String memberName, String message) 
    { 
     ChatSocket member = findMemberByName(memberName); 
     member.session.getRemote().sendStringByFuture(message); 
    } 

    public ChatSocket findMemberByName(String memberName) 
    { 
     // left as exercise to reader 
    } 
} 

中央の場所に、その状態を折り返し報告WebSocketを持っています。

ChatRoom.getInstance().writeSpecificMember("alex", "Hello"); 

// or 

ChatRoom.getInstance().writeAllMembers("Hello all"); 

オプション#2:あなたはあなたの選択のWebSocketをと話をし、上記と同様の技術を使用することができる。この時点でWebSocketCreator

@WebSocket 
public class ChatSocket { 
    public ChatRoom chatroom; 

    public ChatSocket(ChatRoom chatroom) 
    { 
     this.chatroom = chatroom; 
    } 

    @OnWebSocketConnect 
    public void onConnect(Session session) { 
     chatroom.join(this); 
    } 

    @OnWebSocketMessage 
    public void onText(String message) { 
     chatroom.writeAllMembers(message); 
    } 

    @OnWebSocketClose 
    public void onClose(int statusCode, String reason) { 
     chatroom.part(this); 
    } 
} 

public class ChatCreator implements WebSocketCreator 
{ 
    private ChatRoom chatroom; 

    public ChatCreator(ChatRoom chatroom) 
    { 
     this.chatroom = chatroom; 
    } 

    public Object createWebSocket(UpgradeRequest request, 
            UpgradeResponse response) 
    { 
     // We want to create the Chat Socket and associate 
     // it with our chatroom implementation 
     return new ChatSocket(chatroom); 
    } 
} 

public class ChatHandler extends WebSocketHandler 
{ 
    private ChatRoom chatroom = new ChatRoom(); 

    @Override 
    public void configure(WebSocketServletFactory factory) 
    { 
     factory.setCreator(new ChatCreator(chatroom)); 
    } 
} 

を使用して手動でのWebSocketを作成することがあります。

+2

もう一度私の救急隊の戦場で救助に来ます。とても有難い! –

+0

privateリストを使用しないでください。 members = Collections.synchronizedList(new ArrayList <>()); 'ここには? –

+0

最適化/改善が常に必要です。この例は、完全/機能/最適化コードとして与えられていない、技術を理解するための基本的なものに過ぎません。 –

関連する問題