Связь между приложениями через веб-сокеты - PullRequest
4 голосов
/ 02 декабря 2011

У меня возникли проблемы с установлением связи между приложениями через веб-сокеты (то есть без браузера для работы). Поскольку это, похоже, не самое обычное применение веб-сокетов, мне интересно, есть ли у кого-нибудь такой опыт.

Почему я хочу использовать веб-сокеты?

Из-за проблем с брандмауэром мне нужно пройти через порт 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)

     }

Какую проблему я вижу?

ProtocolException

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)

Есть идеи, почему это не работает?

Ответы [ 2 ]

3 голосов
/ 07 марта 2013

Попробуйте добавить "/" в конце вашего адреса в коде клиента:

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

Это просто исправило проблему для меня.

0 голосов
/ 22 декабря 2011

Попытка сделать что-то подобное, чтобы разрешить вызовы WS для встроенного API Jetty REST ... вот мой тестовый код эха (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();
            }

        }
    }
}
...