最近,由于工作需要,老哥我被分配了研究Android客户端和Java服务端利用SocketIO进行通讯。原先的产品通信是基于js和java的,html5+js作为客户端,服务端用netty-socketio实现的,老大来需求了,说那啥啥啥,咱把这个客户端的通讯部分用Android原生的实现,不要基于js实现,我来了句为啥呀?答:js通讯 不是太稳定(由于我对前端几乎是没有了解,也没有JS相关的经历,所以并不知道这个是否是准确的,有大牛路过请给小白普及一下,谢谢!)。额,好吧,开始啪啪啪敲代码呗。
刚开始,还是有点小激动的,因为,作为刚入职场的小菜鸟,还是处于试用期的,能够被单独分配任务,哦~~想想还是有点小鸡冻的,赢取白富美也不是梦想了。so开始各种google资料,先进入他的官网去了解一下SocketIO到底是个啥子东西。
哦,这是个什么鬼,就没有看到我大天朝的文字,作为6级还没有过得文盲简直就是折磨,勉强走过一遍后并没有什么收获。
经过坚持不懈的努力后,终于收获到了你——netty-socketio,这里需要感谢他的作者mrniko。
好了,下面开始进入正题:
先来服务端程序爽一把,话不多说,先上代码:
public class ServerSocketIOForAndroid {
public static void main(String[] args) {
/** * 创建Socket,并设置监听端口 */
Configuration config = new Configuration();
// config.setHostname("192.168.3.225");
//设置主机名
config.setHostname("localhost");
//设置监听端口
config.setPort(9092);
/*config.setUpgradeTimeout(10000000); config.setPingTimeout(10000000); config.setPingInterval(10000000);*/
final SocketIOServer server = new SocketIOServer(config);
/** * 添加连接监听事件,监听是否与客户端连接到服务器 */
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
// 判断是否有客户端连接
if (client != null) {
System.out.println("链接成功。。。");
} else {
System.err.println("并没有人链接上。。。");
}
System.err.println(client.getSessionId().toString());
}
});
/** * 添加监听事件,监听客户端的事件 * 1.第一个参数eventName需要与客户端的事件要一致 * 2.第二个参数eventClase是传输的数据类型 * 3.第三个参数listener是用于接收客户端传的数据,数据类型需要与eventClass一致 */
server.addEventListener("login", String.class, new DataListener() {
@Override
public void onData(SocketIOClient client, String data,
AckRequest ackSender) throws Exception {
// TODO Auto-generated method stub
System.err.println("接收到客户端的信息为:" + data);
//向客户端发送消息
List list = new ArrayList();
list.add("haode");
//第一个参数必须与eventName一致,第二个参数data必须与eventClass一致
client.sendEvent("login", list.toString());
}
});
//启动服务
server.start();
}
}
服务端是基于netty-socketio实现的,需要导入相关的jar包,用maven构建,附上配置文件pom.xml
com.corundumstudio.socketio
netty-socketio
1.7.7
org.slf4j
slf4j-simple
1.7.7
将上述配置参数复制到工程的pom.xml文件中,即可导入所需要的jar包。
服务端到此为止~~~
============================================
Android客户端,老规矩,先上代码爽爽
//创建socket连接
private Socket mSocket;
{
try {
mSocket = IO.socket("http://192.168.3.225:9092/");
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
客户端是基于
上述代码的作用很明显,是创建一个Socket连接,用于客户端和服务器的通讯,IO.socket()里的内容是你服务器端的地址以及监听的端口。
//连接到Server
private void socketConn() {
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
mSocket.connect();
}
这一段代码作用是连接客户端和服务器的,并时刻监听Socket连接是中断。
//取消连接Server
mSocket.disconnect();
mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
连接之后,需要在哦你D额story()方法中加入取消Socket连接操作。
上述操作完成后,就可以“随意”的向服务端发送数据和接收服务端返回的数据了。
发送数据也很方便,只要简单的几句就OK了。
//设置数据
mSocket.emit("login", list);
//连接服务
mSocket.on("login", onLogin);
onLogin是一个对象。
private Emitter.Listener onLogin = new Emitter.Listener() {
@Override
public void call(Object... args) {
String s = (String) args[0];
if (!"".equals(s) || s != null) {
Log.e("server data : ", s);
Message msg = new Message();
msg.what = 0;
handler.sendMessage(msg);
}
}
};
在call()方法中可以做一些需要的操作,例如利用handler更新UI等。
最后莫要忘了,在onDestory()方法中off掉on过的连接。
mSocket.off("login", onLogin);
好了,已经黔驴技穷了,就不再继续秀智商了,奉上源码供各位享用:传送门。