将 android 个应用程序连接到 sockjs 服务器
Connect android app to sockjs server
我正在开发原生 android 应用程序,
我必须将我的应用程序连接到 Sockjs 服务器。
我尝试连接 Socket.IO、Autobahn、WebSockets,但未连接。
android 是否有任何 sockjs 客户端?
请帮忙,谢谢。
Socket.IO :
private void connectToSocket(String serverUrl, String accessKey) {
IO.Options opts = new IO.Options();
opts.forceNew = true;
opts.reconnection = true;
//opts.query = "accessKey="+accessKey;
String host = serverUrl;
try {
mSocket = IO.socket(host, opts);
} catch (URISyntaxException e) {
e.printStackTrace();
}
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on("new message", onNewMessage);
mSocket.connect().emit("accessKey", accessKey);
if (mSocket.connected()) {
Log.d("SocketMsg: ", "Connected");
}
}
private Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(final Object... args) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("SocketMsg: ", args[0].toString());
//mSocket.emit("accessKey", accessKey);
Toast.makeText(MainActivity.this.getApplicationContext(),
"Connect", Toast.LENGTH_LONG).show();
for (Object o : args) {
Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString());
}
}
});
}
};
private Emitter.Listener onConnectError = new Emitter.Listener() {
@Override
public void call(final Object... args) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("SocketMsg: ", args[0].toString());
Toast.makeText(MainActivity.this.getApplicationContext(),
"Error", Toast.LENGTH_LONG).show();
for (Object o : args) {
Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString());
}
}
});
}
};
它给予 'xhr poll error'
我建议你使用 socket.io
.
处有一个很好的客户端和服务器示例
现在使用以下技巧成功连接到 SockJS :)。
1. Place a web view and set its visibility to gone.
2. Use SockJS client in webview.
3. Create a javascript Interface that send data back to native code when get data from socket.
4. We have to call the function only once from native code.
JavaScript 界面:
public class WebAppInterface {
Context mContext;
/**
* Instantiate the interface and set the context
*/
WebAppInterface(Context c) {
mContext = c;
}
/**
* Show a toast from the web page
*/
@JavascriptInterface
public void msg(final String toast) {
Log.d("msg: ", toast);
if (toast.contains("{"))
createMarkerList(toast);
}
}
Webview 上的 SockJS 客户端:
<script type="text/javascript">
function connectToSocket(url, accessKey){
Android.msg(String("called"));
var sock = new SockJS("http://api.example.in:8182/realtime");
sock.onopen = function() {
Android.msg("open");
sock.send(JSON.stringify({
key: accessKey
}));
};
sock.onclose = function() {
Android.msg("close");
};
sock.onmessage = function(e) {
result = e.data.replace(/,\s*$/, '');
Android.msg(String(result));
};
sock.onerror = function(e) {
Android.msg("error");
};
}
</script>
调用js函数:
webView.loadUrl(javascript:connectToSocket(url, accessKey));
我正在开发原生 android 应用程序, 我必须将我的应用程序连接到 Sockjs 服务器。 我尝试连接 Socket.IO、Autobahn、WebSockets,但未连接。 android 是否有任何 sockjs 客户端? 请帮忙,谢谢。
Socket.IO :
private void connectToSocket(String serverUrl, String accessKey) {
IO.Options opts = new IO.Options();
opts.forceNew = true;
opts.reconnection = true;
//opts.query = "accessKey="+accessKey;
String host = serverUrl;
try {
mSocket = IO.socket(host, opts);
} catch (URISyntaxException e) {
e.printStackTrace();
}
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on("new message", onNewMessage);
mSocket.connect().emit("accessKey", accessKey);
if (mSocket.connected()) {
Log.d("SocketMsg: ", "Connected");
}
}
private Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(final Object... args) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("SocketMsg: ", args[0].toString());
//mSocket.emit("accessKey", accessKey);
Toast.makeText(MainActivity.this.getApplicationContext(),
"Connect", Toast.LENGTH_LONG).show();
for (Object o : args) {
Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString());
}
}
});
}
};
private Emitter.Listener onConnectError = new Emitter.Listener() {
@Override
public void call(final Object... args) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("SocketMsg: ", args[0].toString());
Toast.makeText(MainActivity.this.getApplicationContext(),
"Error", Toast.LENGTH_LONG).show();
for (Object o : args) {
Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString());
}
}
});
}
};
它给予 'xhr poll error'
我建议你使用 socket.io
.
现在使用以下技巧成功连接到 SockJS :)。
1. Place a web view and set its visibility to gone.
2. Use SockJS client in webview.
3. Create a javascript Interface that send data back to native code when get data from socket.
4. We have to call the function only once from native code.
JavaScript 界面:
public class WebAppInterface {
Context mContext;
/**
* Instantiate the interface and set the context
*/
WebAppInterface(Context c) {
mContext = c;
}
/**
* Show a toast from the web page
*/
@JavascriptInterface
public void msg(final String toast) {
Log.d("msg: ", toast);
if (toast.contains("{"))
createMarkerList(toast);
}
}
Webview 上的 SockJS 客户端:
<script type="text/javascript">
function connectToSocket(url, accessKey){
Android.msg(String("called"));
var sock = new SockJS("http://api.example.in:8182/realtime");
sock.onopen = function() {
Android.msg("open");
sock.send(JSON.stringify({
key: accessKey
}));
};
sock.onclose = function() {
Android.msg("close");
};
sock.onmessage = function(e) {
result = e.data.replace(/,\s*$/, '');
Android.msg(String(result));
};
sock.onerror = function(e) {
Android.msg("error");
};
}
</script>
调用js函数:
webView.loadUrl(javascript:connectToSocket(url, accessKey));