【问题标题】:Application-to-Application communication through web sockets通过 Web 套接字进行应用程序到应用程序的通信
【发布时间】:2013-03-07 22:51:02
【问题描述】:

我在通过 Web 套接字(即没有浏览器工作)进行应用程序到应用程序的通信时遇到了一些问题。由于这似乎不是网络套接字最常见的应用,我想知道是否有人有这样做的经验。

为什么要使用网络套接字?

由于防火墙问题,我需要通过端口 80/8080(并且我需要继续处理一些其他 HTTP 通信,所以我不能只使用普通的 TCP/IP 套接字通信)。

我是如何做到这一点的?

我将 Jetty 8.0 用于服务器和客户端。我的服务器代码:

public class WebSocketTestServlet extends WebSocketServlet {

    public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
        return new TestWebSocket();
    }

    class TestWebSocket implements WebSocket, WebSocket.OnTextMessage
    {
         public void onClose(int arg0, String arg1) {   
         }

         public void onOpen(Connection arg0) {
         }

         public void onMessage(String messageText) {
         }

    }
}

我的客户代码:

public class MyWebSocketClient{

    MyWebSocketClient() throws IOException
    {       
        WebSocketClientFactory factory = new WebSocketClientFactory();
        try {
            factory.start();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        WebSocketClient client = factory.newWebSocketClient();

        WebSocket.Connection connection = client.open(new URI("ws://myserver:8080/testws"), new WebSocket.OnTextMessage()
        {
             public void onOpen(Connection connection)
             {
             } 

             public void onClose(int closeCode, String message)
             {
             }

             public void onMessage(String data)
             {
             }
        }).get(50, TimeUnit.SECONDS)

     }

我看到了什么问题?

协议异常

Caused by: java.net.ProtocolException: Bad response status 302 Found
    at org.eclipse.jetty.websocket.WebSocketClientFactory$HandshakeConnection.closed(WebSocketClientFactory.java:423)
    at org.eclipse.jetty.websocket.WebSocketClientFactory$WebSocketClientSelector.endPointClosed(WebSocketClientFactory.java:235)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.destroyEndPoint(SelectorManager.java:948)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.doUpdateKey(SelectChannelEndPoint.java:523)
    at org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:469)
    at org.eclipse.jetty.io.nio.SelectorManager$1.run(SelectorManager.java:283)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:619)

知道为什么这不起作用吗?

【问题讨论】:

  • 我也有同样的问题。你找到解决办法了吗?

标签: java jetty websocket


【解决方案1】:

尝试在客户代码中地址末尾添加“/”:

"ws://myserver:8080/testws/"

它只是为我解决了这个问题。

【讨论】:

    【解决方案2】:

    尝试做类似的事情以允许 WS 调用嵌入式 Jetty REST API...这是我的回声测试代码 (Jetty 7),HTH

    
    public class myApiSocketServlet extends WebSocketServlet
    {    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException ,IOException 
        {
            OutputStream responseBody = response.getOutputStream();
            responseBody.write("Socket API".getBytes());
            responseBody.close();
        }
    
        public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
        {
            return new APIWebSocket();
        }
    
        class APIWebSocket implements WebSocket, WebSocket.OnTextMessage
        {
    
            Connection connection; 
    
            @Override
            public void onClose(int arg0, String arg1)
            {
    
            }
    
            @Override
            public void onOpen(Connection c)
            {
                connection = c;     
            }
    
            @Override
            public void onMessage(String msg)
            {
                try
                {
                    this.connection.sendMessage("I received: " + msg);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多