我希望能够将浏览器用作我的Android设备上的短信编辑器(例如https://www.mysms.com)。因此,我开始编写一个充当套接字服务器并使用浏览器作为客户端的android应用(例如http://www.websocket.org/echo.html)。我能够从该客户端访问我的应用程序并从中获取消息,但是我现在遇到了WebSocket握手(Sec-WebSocket-Key等)问题。
编辑:
我按照本教程编写了Android服务器:http : //android-er.blogspot.co.at/2014/02/android-sercerclient-example-server.html
当我尝试从http://www.websocket.org/echo.html到达该服务器时,出现此js错误:WebSocket握手期间出错:状态行无效
编辑:
所以我添加了带有Sec-WebSocket-Accept:行的编码密钥的标头
// get the key from the input
InputStream inputStream = hostThreadSocket.getInputStream();
String line = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = reader.readLine()) != null) {
if(line.contains("Sec-WebSocket-Key:")){ // stop then the line containing the key is found
break;
}
}
} catch (IOException e) {
}
String key = line.replace("Sec-WebSocket-Key:", "");
并使用以下方法对结果进行编码:
static String encodeString(String input) {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-1");
byte[] inputBytes = input.getBytes();
byte[] hashBytes = digest.digest(inputBytes);
return Base64.encodeToString(hashBytes, Base64.DEFAULT);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
并传递标题,如下所示:
String key = line.replace("Sec-WebSocket-Key:", "");
key = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key = encodeString(key).replace("\n", "");;
String header = "HTTP/1.1 101 Switching Protocols\r\n" +
"Upgrade: websocket \r\n" +
"Connection: Upgrade \r\n" +
"Sec-WebSocket-Accept: " + key + "\r\n"+
"Sec-WebSocket-Protocol: chat\r\n\r\n" + msgReply;
printStream.print(header);
printStream.close();
响应头现在看起来像这样:
Connection:Upgrade\r\n
Sec-WebSocket-Accept:/Qg4DR68UCCo9VKy4vbDgswCU8Y=\r\n
Upgrade:websocket\r\n
但是我仍然收到错误:失败:WebSocket握手期间错误:错误的“ Sec-WebSocket-Accept”头值
我终于可以进行websocket握手了。我不知道到底有什么改变使我成功,但这是有效的代码:
InputStream inputStream = hostThreadSocket.getInputStream();
String line = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = reader.readLine()) != null) {
if (line.contains("Sec-WebSocket-Key: ")) { // check if its the header-line containing the websocket key
break;
}
}
} catch (IOException e) {
Log.e(TAG_TEST, e.getMessage(), e);
}
Matcher matcher = pattern.matcher(line); // with pattern "Sec-WebSocket-Key:[ ]*([^\r^\n]*)" to parse the key out of the line
boolean matches = matcher.matches();
String key = matcher.group(1);
key = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // adding the "magic string"
key = encodeString(key);
String header = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
"Upgrade: websocket\r\n" +
"Connection: Upgrade\r\n" +
"Sec-WebSocket-Accept:" + key + "\r\n\r\n";
printStream.print(header);
这就是我对密钥进行编码的方法
static String encodeString(String input) {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-1");
byte[] inputBytes = input.getBytes();
byte[] hashBytes = digest.digest(inputBytes);
return Base64.encodeToString(hashBytes, Base64.NO_WRAP);
} catch (NoSuchAlgorithmException e) {
Log.e(TAG_TEST, e.getMessage(), e);
}
return "";
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句