2013-03-26 2 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() 메서드를 통해 자체 WebSocketConnections를 추적 할 수 있습니다. 일단 프로그램이 실행되면 MyEchoSocket의 인스턴스에 액세스하는 방법을 모르겠습니다. –

+0

누구를 밀어 붙이려고합니까? 만약 누군가가 당신에게 연결되어 있다면, 아마도 비동기 처리기를 생성하여 푸싱을해야 할 것입니다. –

답변

27

두 가지 일반적인 기술이 여기에 초간편 chatroom 개념으로 소개되었습니다.

옵션 # 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)); 
    } 
} 

수동으로 웹 소켓을 생성하게한다.

+2

부두 전장에서 구조 작업을 다시하고 있습니다. 매우 감사! –

+0

private 목록을 사용하지 않아야합니다 members = Collections.synchronizedList (new ArrayList <>());'여기에? –

+0

최적화/개선이 항상 필요합니다. 예제는 기술을 이해하기위한 기본 사항 일 뿐이며 전체/기능/최적화 코드로는 제공되지 않습니다. –

관련 문제