我一直在开发 Android(Java) 应用程序,创建一个 websocket 服务器, 一切顺利,连接被接受。
问题是向客户端发送消息(浏览器 webSocket)
OutputStream writer = client.getOutputStream();
// FIN OPCODE 1000 0001
writer.write(0x81);
// message length
writer.write(0x5);
writer.write('H');
writer.write('e');
writer.write('l');
writer.write('l');
writer.write('o');
writer.flush();
我得到一个错误:
failed: Invalid frame header
我安装webshark看到问题:
在右边你会看到数据
- 0x0A -> 问题。
====== 更多代码 =======
我如何阅读客户请求(标题)?
private String readClientInputStream() {
String str = null;
try {
InputStream in = client.getInputStream();
byte[] buffer = new byte[1024];
int countBytesRead = in.read(buffer);
if (countBytesRead > 0) {
str = new String(buffer, 0, countBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
使用
str
获取Sec-WebSocket-Key
并发送响应(握手):
public void sendWebSocketHandShake(String str) {
String[] result = str.split("Sec-WebSocket-Key: ", -1)[1].split("\\n");
String key = makeKeyAccept(result[0]); // METHOD CODE BELLOW
StringBuilder handshake_str = new StringBuilder();
handshake_str.append("HTTP/1.1 101 Switching Protocols\n");
handshake_str.append("Upgrade: websocket\n");
handshake_str.append("Connection: Upgrade\n");
handshake_str.append("Sec-WebSocket-Accept: ").append(key).append("\n");
handshake_str.append("\n");
try {
OutputStream out = client.getOutputStream();
byte[] b = handshake_str.toString().getBytes(StandardCharsets.UTF_8);
out.write(b, 0, b.length);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
我如何制作
Sec-WebSocket-Accept
键?
public String makeKeyAccept(String key) {
String _acceptKey = key.trim() + WEBSOCKET_KEY_MAGIC;
MessageDigest digest = null;
String base64 = null;
try {
digest = MessageDigest.getInstance("SHA-1");
digest.update(_acceptKey.getBytes(StandardCharsets.UTF_8));
byte[] encoded = android.util.Base64.encode(digest.digest(), 0, digest.getDigestLength(), android.util.Base64.DEFAULT);
base64 = new String(encoded, 0, encoded.length, StandardCharsets.UTF_8);
} catch (Exception ignore){}
return base64;
}