2015-04-01 36 views
1

我很新的websocket編程(或更好的:網絡編程)。 前一段時間,我做了一些使用套接字和服務器套接字在客戶端和服務器之間交換數據的東西,現在我開始使用WebSockets和jetty構建類似功能的東西,但直到現在才知道。碼頭:套接字連接作爲websocket連接

所以我打算做的是:客戶端得到一個字符串消息,使用websocket將其發送到服務器,服務器只是將該消息粘貼到控制檯或文件中。 一般上下文:我有兩個應用程序在不同的機器上運行,並希望使用websockets在它們之間交換一些數據。

所以這是我的客戶端的代碼:

public class SocketClient { 
    public static void main(String[] args) throws URISyntaxException { 
     try { 
      new SocketClient().run(new URI("ws://localhost:8080/")); 
      //new SocketClient().run(new URI("wss://localhost:8443/")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
    public void run(URI destURI) throws Exception { 
     WebSocketClient client = new WebSocketClient(); 
     try { 
      client.start(); 
      ClientUpgradeRequest request = new ClientUpgradeRequest(); 

      ExampleSocket socket = new ExampleSocket(); 
      Future<Session> future = client.connect(socket,destURI,request); 

      future.get(); 

      socket.getRemote().sendString("hello server"); 
     } 
     finally 
     { 
      client.stop(); 
     } 
    } 
} 


class ExampleSocket extends WebSocketAdapter 
{ 
    @Override 
    public void onWebSocketText(String message) 
    { 
     try 
     { 
      getRemote().sendString(message); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

這就是我的服務器代碼:

public class SocketServer extends AbstractHandler { 
    public void handle(String target, Request baseRequest,HttpServletRequest request, HttpServletResponse response) { 
     try { 
      response.setContentType("text/html"); 
      response.setStatus(HttpServletResponse.SC_OK); 
      baseRequest.setHandled(true); 

      response.getWriter().println(request); 
     } 
     catch (IOException ioe) { 
      System.out.println(ioe); 
     } 
    } 
    public static void main(String[] args) throws Exception { 
     Server server = new Server(8080); 
     server.setHandler(new SocketServer()); 

     server.start(); 
     server.join(); 
    } 
} 

我都大多是從碼頭單證,但找不出它到現在爲止。當我試圖運行它們放在一起讓我的客戶端上的錯誤:

java.util.concurrent.ExecutionException: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols 
    at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:123) 
    at SocketClient.run(SocketClient.java:37) 
    at SocketClient.main(SocketClient.java:19) 
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols 
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:278) 
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:205) 
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:150) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 
    at java.lang.Thread.run(Unknown Source) 

所以感謝很多提前,任何幫助表示讚賞。

回答

3

WebSocket客戶端需要WebSocket服務器。你在服務器上做的是隻添加一個處理程序來處理HTTP請求 - 響應交換。您需要允許Jetty通過註冊org.eclipse.jetty.websocket.servlet.WebSocketServlet的小服務程序或端點javax.websocket.Endpoint來處理WebSocket資源。

這裏是由Jetty team寫的working examples。如果你不是JSR的粉絲,那麼看看native-jetty-websocket-example。

無論如何,Jetty團隊會給你明確的答案,如果這個答案是不完整的,因爲他們正在觀看碼頭標籤。

+0

感謝您的建議,我錯過了一些東西。試圖用Endpoint解決它,這讓我更接近解決方案。目前我們試圖解決整個問題有點不同,所以它被認爲是解決了。非常感謝! – Nidhoeggr 2015-04-14 15:56:34

+0

的確,您需要客戶端的websocket和服務器端點的websocket。我遇到了同樣的問題,但是當我按照下面的示例4.6時,所有事情都很清楚: https://examples.javacodegeeks.com/enterprise-java/jetty/jetty-websocket-example/ 無論誰有這個問題,試着仔細看看那個鏈接,這是有道理的。 – ancab 2017-05-25 08:49:36