Связь Websocket между хром (клиентом) и точкой доступа (сервер) (строка состояния не заканчивается CRLF)

это то, что у меня есть:

  • Я создал приложение для Android для своего мобильного устройства, и я использую приложение из Google Play в качестве сервера.
  • Я открываю свою горячую точку, и пользователь может получить доступ к моему Wi-Fi с ip и портом, например: 192.168.xxx.xxx:8080

Он увидит мой сайт. Там я использую websockets для передачи данных между javascript и android java.

В Firefox и Explorer он отлично работает, но в Chrome он говорит мне: "Соединение с Websocket с" ws://192.168.xxx.xxx: 9999/ "не выполнено: ошибка при рукопожатии websocket: строка состояния не заканчивается с CRLF".

Я использовал код здесь: Написание сервера WebSocket  (См. Файл ниже " EDIT" ).

Также я читаю RFC 6455: https://tools.ietf.org/html/rfc6455, и я делаю точно так же, как писал там.

Этот пример ClientSession:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientSession {
 private Socket socket;
 public ClientSession(Socket socket) {
 System.out.println("new ClientSessionTest()");
 this.socket = socket;
 initClientListener();
 }
 private void initClientListener() {
 System.out.println("initClientListener()");
 Thread t = new Thread(new Runnable() {
 @Override
 public void run() {
 try {
 BufferedReader socketReader = new BufferedReader(
 new InputStreamReader(socket.getInputStream()));
 final PrintWriter socketWriter = new PrintWriter(socket
 .getOutputStream(), true);
 String clientKey = null;
 String responseKey = null;
 while (true) {
 String line = socketReader.readLine();
 if (line == null) {
 System.out.println("received null from client - closing connection");
 break;
 } else if (line.isEmpty()) {
 System.out.println("empty line");
 String _01 = "HTTP/1.1 101 Switching Protocols";
 String _02 = "Upgrade: websocket";
 String _03 = "Connection: Upgrade";
 String _04 = "Sec-WebSocket-Accept: " + responseKey;
 String _05 = "Sec-WebSocket-Protocol: chat";
 String _06 = "Content-Encoding: identity";
 System.out.println(_01);
 System.out.println(_02);
 System.out.println(_03);
 System.out.println(_04);
 System.out.println(_05);
 System.out.println(_06);
 System.out.println("");
 socketWriter.println(_01);
 socketWriter.println(_02);
 socketWriter.println(_03);
 socketWriter.println(_04);
 socketWriter.println(_05);
 socketWriter.println(_06);
 socketWriter.println("");
 //********************data from client*********************
 try {
 byte[] buff = new byte[100];
 int length = socket.getInputStream().read(buff);
 byte[] bstr = new byte[length];
 System.arraycopy(buff, 0, bstr, 0, length);
 System.out.println(new String(bstr));
 for (byte b : bstr) {
 System.out.print(((int) b) + " ");
 }
 System.out.println();
 System.out.println();
 String str = new String(decodeFrame(buff),"UTF-8");
 System.out.println(str);
 } catch (Exception e) {
 System.out.println(e.getMessage());
 //********************************************************
 }
 } else if (line.startsWith("Sec-WebSocket-Key:")) {
 clientKey = line.replace("Sec-WebSocket-Key: ", "");
 responseKey = ResponseGenerator
 .toResponseKey(clientKey);
 } else {
 System.out.println("" + line);
 //socketWriter.println("lala");
 }
 }
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 });
 t.start();
 }

Я изменил строку String _01 = "HTTP/1.1 101 Switching Protocols"; до String _01 = "HTTP/1.1 101 Переключение протоколов \r\n"; и его удалить ошибку (CRLF), которую я написал выше, но метод onopen из кода javascript (ниже) не запускается, и после этого Firefox и Explorer не работают.

JavaScript:

Примечание:

В моем мобильном телефоне нет подключения к Интернету (без Wi-Fi или 3g). подключение осуществляется только от пользователя к моей точке доступа.

1 ответ

Я думаю, что ошибка немного вводит в заблуждение. Кажется, что каждый заголовок должен заканчиваться CRLF, а не только первый ( "строка состояния" ). По крайней мере, согласно тесту .

String _01 = "HTTP/1.1 101 Switching Protocols\r"; // Added \r here.
String _02 = "Upgrade: websocket\r"; // Added \r here.
String _03 = "Connection: Upgrade\r"; // Added \r here.
String _04 = "Sec-WebSocket-Accept: " + responseKey + "\r"; // Added \r here.
String _05 = "Sec-WebSocket-Protocol: chat\r"; // Added \r here.
String _06 = "Content-Encoding: identity\r"; // Added \r here.

Также добавьте еще один \r в последний socketWriter.println("") -

socketWriter.println("\r"); // Added \r here.

Возможно, он помечает это как конец ответа.

Кроме того, вы можете использовать Fiddler2 (или Wireshark, но это слишком много), чтобы сравнить различия между вашей реализацией WebSocket (с точки зрения сетевых данных) и той, которая работает.

licensed under cc by-sa 3.0 with attribution.