修改前的java代码如下,经过反复对比,发觉回传信息的String与C#那个服务器代码一致,但iOS与Android就是连不上,一发回握手信息就失败。而且是还没发任何消息,一发送握手就失败。推测是握手信息的问题。由于String一模一样,推测是编码问题。println编译好后的byte数组,发觉大体也一致,没啥问题:
85 U
112 p
103 g
114 r
97 a
100 d
101 e
58 :
32
87 W
101 e
98 b
83 S
111 o
99 c
107 k
101 e
116 t
10
就是发觉有微妙异样,同时修改C#代码,也让它把byte数组打印出来:
原来是回车那儿的问题:
java的\n会被UTF-8编码为10
而C#里面的Environment.NewLine会被UTF-8编码成13 10。
解决办法自然是把漏掉的13给每个10前加上,修改代码如下:
private static StringBuilder PackHandShakeData(String secKeyAccept) {
StringBuilder responseBuilder = new StringBuilder();
char b=13;
//At here \n means the 13 of UTF-8 word.
responseBuilder.append("HTTP/1.1 101 Switching Protocols").append(b).append("\n");
responseBuilder.append("Upgrade: WebSocket").append(b).append("\n");
responseBuilder.append("Connection: Upgrade").append(b).append("\n");
responseBuilder.append("Sec-WebSocket-Accept: ").append(secKeyAccept).append(b).append("\n").append(b).append("\n");
return responseBuilder;
}
于是就能成功链接了: