2015-04-01 35 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