2015-08-22 3 views
3

Я пытаюсь подключиться к веб-чату обмена чатами Stack Exchange. Websocket используется для приема новых событий в чате, таких как новые сообщения.OkHTTP Websocket: Неожиданный конец пара при подключении

Вот код, используемый для создания WebSocket:

String wsUrl = getWsUrl(); 
Request wsRequest = new Request.Builder() 
     .url(wsUrl) 
     .build(); 
WebSocketCall wsCall = WebSocketCall.create(httpClient, wsRequest); 
wsCall.enqueue(new ChatWebSocketListener()); 

WebSocket URL в этой форме:

wss://chat.sockets.stackexchange.com/events/16/4b3a8a1f68704b8db35ce9f0915c7c45 

WebSocketListener получает onFailure только ответ, с этим исключением:

E/IOException﹕ unexpected end of stream on Connection{chat.sockets.stackexchange.com:443, [email protected] hostAddress=192.111.0.32 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=http/1.1} (recycle count=0) 
    java.io.IOException: unexpected end of stream on Connection{chat.sockets.stackexchange.com:443, [email protected] hostAddress=192.111.0.32 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=http/1.1} (recycle count=0) 
      at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:211) 
      at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
      at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917) 
      at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:757) 
      at com.squareup.okhttp.Call.getResponse(Call.java:274) 
      at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230) 
      at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201) 
      at com.squareup.okhttp.Call.access$100(Call.java:36) 
      at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:164) 
      at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:831) 
    Caused by: java.io.EOFException: \n not found: size=0 content=... 
      at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:200) 
      at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) 
            at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
            at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917) 
            at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:757) 
            at com.squareup.okhttp.Call.getResponse(Call.java:274) 
            at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230) 
            at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201) 
            at com.squareup.okhttp.Call.access$100(Call.java:36) 
            at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:164) 
            at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
            at java.lang.Thread.run(Thread.java:831) 

Я не уверен, что я здесь делаю неправильно, или как o interperet это исключение. Что случилось с этим веб-сайтом, и как я могу его исправить?

+0

Вы уверены, что это правильный URL? Попробуйте подключиться к ws: //echo.websocket.org и посмотреть, работает ли он. Также обратите внимание, что в случае замены stackexchange может использоваться неподдерживаемая версия реализации WebSocket. –

+0

@ GergelyKőrössy 'ws: // echo.websocket.org' возвращает 400: Bad Request, когда я пытаюсь подключиться, а не 101, мы хотим, но' wss: // echo.websocket.org' отлично работает ... –

+0

Да, небезопасный не работает на веб-сайте. Возможно ли, что вы перенаправлены, но OkHTTP не реализует механизм перенаправления? Или версия WebSocket, используемая обменом стека, отличается от реализованных в OkHTTP ... –

ответ

2

WebSocket сервер чата игнорирует запрос, если он не имеет как:

  • URL-адрес пары l, соответствующее значению отправленного обратно, когда список событий загружаются.
  • Заголовок Origin установлен на "http://stackexchange.com".

Вы просто должны добавить те к вашему запросу:

Request wsRequest = new Request.Builder() 
     .url(wsUrl+"?l=" + valueFromLoadingEvents) 
     .addHeader("Origin", "http://stackexchange.com") 
     .build(); 
+0

Не могли бы вы объяснить, что содержит значение FromLoadingEvents? Может быть, пример для этого значения? –

+0

@ChristianD Я не касался этого в течение длительного времени, и он, возможно, изменился, но если я правильно помню, это случайное значение ID-типа на странице, которую вы должны предоставить, чтобы открыть соединение. –