我正在为Android构建一个简单的websocket服务器。(让我们说 3.2 - 我尝试了一些早期的 Android 版本,结果相同)。在Android上尝试代码之前,我在Windows,Linux上的Java SE下对其进行了测试。它在Chrome和Firefox上工作正常。但是在安卓上它不起作用。请参阅代码中的注释。
总之:
- 我成功通过握手,浏览器确认连接正常。
- 我很高兴通过Websocket从浏览器接收所有消息
- 我无法发送任何东西:它只是没有到达javascript回调。经过几次重试(有时立即)后,浏览器会关闭 websocket。
这是代码:
//BufferedOutput myout=new BufferedOutput(mysocket.getOutputStream()));
//myout was successfully used for handshaking before
String msg=”I want to send this”;
try {
myout.write(129);//129=0x81); text frame 0x81=129
int payloadlen=msg.length();
myout.write(payloadlen);
byte[] bts=msg.getBytes(Charset.forName("UTF-8"));
myout.write(bts,0,payloadlen);
myout.flush();//after this command client Browser closes websocket
//firefox also gives error
}
catch(IOException ee)
{
System.out.println("Error sending websocket message"+ee);
try{myclose();}catch(IOException eio){}
}
}
谢谢
你在哪里运行这段代码?在活动或服务中。
请注意,如果您需要创建一个自定义的 Web 服务器并需要在 Android 上运行它,您应该将其实现为在自己的线程上运行的服务。
如果您在依赖于 android 版本的 Activity 上运行它,则主线程不应(或不能,取决于 android 版本)在主线程上执行 I/O 操作。
我希望它有所帮助。
我解决了。原因是在Android的情况下,我之前通过相同的连接发送了一些东西。而这个"东西"虽然是错误的,但不知何故在Chrome/Firefox中没有产生任何错误。 我花了两天时间,对两种情况的Wireshark结果进行了逐字节比较:我的Sun Java Websocket Server和我的Android Websocket Server。