我正在开发一个与 Web 服务器通信并需要来自服务器的推送通知的 Android 应用程序。
此应用程序成功运行并按预期使用 Tornado 2.1 作为 Web 服务器并在 Android 客户端应用程序中使用 weberknecht websockets。
但是,在 Tornado 3.1 中,当我尝试调用“websocket.connect()”方法时,同一个应用程序总是返回异常。
Tornado 3.1 客户端应用程序中的异常:-
连接失败:未知状态码 426 导致 WebSocketException (id=830032153816)
我在 stackoverflow 上读到 weberknecht 可能与最新的 Tornado 3.1 不兼容。因此,我搬到了 Autobahn web socket。但是,如果我导入高速公路 websocket jar,应用程序会在“连接”方法处崩溃。我也试过 jwebsocket 客户端。我也面临同样的问题。
我的代码中是否缺少某些内容?weberknecht 与 Tornado 3.1 不兼容吗?我有哪些使用 Tornado 3.1 的替代方案?或者我应该继续使用 Tornado 2.1 吗?
我的申请代码:-
public class MainActivity extends Activity {
protected static final String TAG = null;
BaseTokenClient btc;
Toast testToast;
private WebSocketConnection websocket;
URI url;
private class AsyncThread extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
websocket.connect();
} catch (de.roderick.weberknecht.WebSocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
url = null;
try {
url = new URI("ws://192.168.1.130:8888/ws");
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
websocket = new WebSocketConnection(url);
} catch (de.roderick.weberknecht.WebSocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Register Event Handlers
websocket.setEventHandler(new WebSocketEventHandler() {
public void onOpen()
{
Log.e(TAG, "--open");
try {
websocket.send("HELLO");
} catch (de.roderick.weberknecht.WebSocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onMessage(WebSocketMessage message)
{
Log.e(TAG, "--received message: " + message.getText());
System.out.println(message.getText());
}
public void onClose()
{
Log.e(TAG, "--close");
}
});
new AsyncThread().execute();
}
}
我的 Tornado 网络服务器代码:-
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'new connection'
self.write_message("Hello World")
def on_message(self, message):
print 'message received %s' % message
def on_close(self):
print 'connection closed'
application = tornado.web.Application([
(r'/ws', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()