2012-10-13 2 views
2

플랫폼 상태에 따르면, 그것은해야합니다. 기본 Hello World 증명 개념을 달성하려고하지만 Java 클라이언트를 PlayN을 사용하여 내 서버에 연결할 수 없습니다. createWebSocket()을 호출하자마자 onClose()가 호출됩니다. 그러나 표준 html 페이지를 사용하여 서버에 연결할 수있었습니다.Java의 PlayN websocket 구현이 작동하고 있습니까?

클라이언트 코드 : 여기

WebSocket s = PlayN.net().createWebSocket("ws://localhost:8080/test", new Net.WebSocket.Listener(){ 
    public void onClose() {System.out.println("close");};  
    public void onDataMessage(ByteBuffer msg) {System.out.println("data");}; 
    public void onError(String reason) {System.out.println("error");}; 
    public void onOpen() {System.out.println("open");}; 
    public void onTextMessage(String msg) { System.out.println("text");}; 
    }); 

답변

1

나는 마침내 문제를 발견했다. PlayNT의 1.4 버전은 Draft10 dy default를 사용합니다. PlayN의 로컬 사본을 http://mvnrepository.com/artifact/com.netiq/websocket으로 업데이트했으며 기본 초안을 Draft17로 변경했으며 Tomcat에 연결할 수있었습니다.

1

는 부두에 샘플 웹 소켓 서블릿 구현 :

import java.io.IOException; 
import java.util.Set; 
import java.util.concurrent.CopyOnWriteArraySet; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.eclipse.jetty.websocket.WebSocket; 
import org.eclipse.jetty.websocket.WebSocketFactory; 

public class SampleServlet extends HttpServlet { 
    private static final long   serialVersionUID = 1L; 

    private WebSocketFactory   wsFactory; 
    private final Set<SampleWebSocket> members    = new CopyOnWriteArraySet<SampleWebSocket>(); 

    @Override 
    public void init() throws ServletException { 
     wsFactory = new WebSocketFactory(new WebSocketFactory.Acceptor() { 

      @Override 
      public boolean checkOrigin(final HttpServletRequest request, final String origin) { 
       // Allow all origins 
       return true; 
      } 

      @Override 
      public WebSocket doWebSocketConnect(final HttpServletRequest request, final String protocol) { 
       return new SampleWebSocket(); 
      } 

     }); 
     wsFactory.setBufferSize(4096); 
     wsFactory.setMaxIdleTime(60000); 
    } 

    @Override 
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException { 
     if (wsFactory.acceptWebSocket(request, response)) { 
      return; 
     } 

     response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Websocket only"); 
    } 

    public class SampleWebSocket implements WebSocket.OnTextMessage { 
     private volatile Connection   connection; 

     public SampleWebSocket() { 
     } 

     @Override 
     public void onClose(final int closeCode, final String message) { 
      members.remove(this); 
      System.out.println("onClose: closeCode=" +closeCode+ ", message: '" +message+ "'");  
     } 

     @Override 
     public void onOpen(final Connection connection) { 
      this.connection = connection; 
      System.out.println("onOpen: connection=" +connection);   
      members.add(this); 

      // Send sample binary message back 
      try { 
       connection.sendMessage("Sample message"); 
      } catch (final IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onMessage(final String data) { 
      System.out.println("onMessage: data=" +data); 

      // Relay message to other connected clients 
      for (final SampleWebSocket member: members) { 
       try { 
        member.connection.sendMessage(data); 
       } catch (final IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 
} 
관련 문제