2015-06-03 6 views
4

Я пытаюсь написать простой клиент websocket в Java для подключения к стороннему серверу WebSocket (у меня нет доступа к серверу).Простой клиент Websocket в Java - проблема подключения

Я могу подключиться и подключиться к серверу websocket с помощью javascript в браузере, но когда я пытаюсь сделать то же самое с помощью клиента Java, он не может подключиться.

С тем же java-клиентом я могу подключиться к серверу webcocket tomcat, который у меня запущен, поэтому я думаю, что это какая-то проблема совместимости между клиентом и сервером. (Я использую библиотеки Tomcat 7.0.56 для клиента websocket).

Это ошибка я получаю ...

Ошибка

javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection failed 
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:344) 
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:166) 
    at com.cvr.instant.ws.WebSocketClient.Connect(WebSocketClient.java:44) 
    at com.cvr.instant.ws.TestWS.Start(TestWS.java:17) 
    at com.cvr.instant.ws.TestWS.main(TestWS.java:37) 
Caused by: java.io.EOFException 
    at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:595) 
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:317) 
... 4 more 

WebSocketClient

import java.io.IOException; 
import java.net.URI; 
import java.net.URISyntaxException; 

import javax.websocket.ClientEndpoint; 
import javax.websocket.CloseReason; 
import javax.websocket.ContainerProvider; 
import javax.websocket.DeploymentException; 
import javax.websocket.OnClose; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.WebSocketContainer; 

@ClientEndpoint 
public class WebSocketClient { 

    protected WebSocketContainer container; 
    protected Session userSession = null; 

    public WebSocketClient() { 
     container = ContainerProvider.getWebSocketContainer(); 
    } 

    public void Connect(String sServer) { 

      try { 
       userSession = container.connectToServer(this, new URI(sServer)); 

      } catch (DeploymentException | URISyntaxException | IOException e) { 
       e.printStackTrace(); 
      } 

    } 

    public void SendMessage(String sMsg) throws IOException { 
     userSession.getBasicRemote().sendText(sMsg); 
    } 

    @OnOpen 
    public void onOpen(Session session) { 
     System.out.println("Connected"); 
    } 

    @OnClose 
    public void onClose(Session session, CloseReason closeReason) { 
    } 

    @OnMessage 
    public void onMessage(Session session, String msg) { 
     System.out.println(msg); 
    } 

    public void Disconnect() throws IOException { 
     userSession.close(); 
    } 
} 

Запуск клиента

import java.io.IOException; 

public class TestWS { 

    public WebSocketClient wsc; 
    public TestWS() { 
    } 

    public void Start() throws InterruptedException, IOException { 

     wsc = new WebSocketClient(); 
     wsc.callback = this; 
     wsc.Connect("ws://192.168.0.25:9000"); 
     Thread.sleep(1000); 
     wsc.Disconnect(); 
    } 


    public static void main(String[] args) throws InterruptedException, IOException 
    { 
     TestWS t = new TestWS(); 
     t.Start(); 
     Thread.sleep(1000); 
    } 

}  

Я очень новичок в отношении клиентов websocket (и довольно новых для веб-сайтов в целом). Любая помощь, которую вы можете дать, будет оценена по достоинству!

+0

брандмауэр вопрос? –

+0

Вы можете проверить, является ли это проблемой брандмауэра, запустив [this] (http://stackoverflow.com/questions/26452903/javax-websocket-client-simple-example) простой клиент websocket. Если это не работает, возможно, это проблема с файерволом. Кроме того, вы можете запустить [Wireshark] (https://www.wireshark.org/) и проверить сетевые проблемы. –

+0

Ок - проблема не в брандмауэре - это было то, что для этого адреса был нужен «/» на конце: ws: //192.168.0.25: 9000/Дополнительный слэш не требовался при подключении с javascript - и Я немного не уверен, почему это было необходимо здесь ... – flinthart

ответ

2

Я нашел проблему - это было то, что для ws-адреса требовалось «/» на конце его при запуске из java-клиента.

JavaScript WS: //192.168.0.25: 9000

Java WS: //192.168.0.25: 9000/

Не знаю, почему это требуется в Java - но это решил проблему ...

+0

да .it works .. – user2376546

Смежные вопросы