1 背景
实际项目中常使用socket进行通信,我们可以使用第三方框架IOSocket进行网络socket通信,通常的写法是每一个监听都对应一个Linstener, 一旦协议多起来,代码量将是样当的大,很容易出错,思前想后,想到对IOSocket进行了封装,子类socket只需要书写很少代码便可以定制网络协议,经松地优雅编程
2 主要用到的技术
java反射机制,java接口回调
3 核心代码
A 通过java获得socket协议数据
/***
* 通过反射得到本类所有的公有静态字段(不包括父类) 所表示的所有的协议
*
* @param clazz
* 类名
* @return
*/
private List<String> getAllPublicStaticFiledsValues(Class<?> clazz) {
List<String> listString = new ArrayList<String>();
Field fields[] = clazz.getDeclaredFields();// 获得本类所有的静态公有字段(不包括父类)
try {
for (int i = 0; i < fields.length; i++) {
int modifiers = fields[i].getModifiers();
if (fields[i].getType() == String.class
&& Modifier.isStatic(modifiers)
&& Modifier.isPublic(modifiers)) {// 静态公有字段并且是String类型
listString.add(fields[i].get(null) + "");
}
}
} catch (Exception e) {
}
return listString;
}
B 定义接口回调
private onGetSocketDataListener onGetSocketDataListener;
public void setOnGetSocketDataListener(onGetSocketDataListener listener) {
this.onGetSocketDataListener = listener;
}
public interface onGetSocketDataListener {
// 远程socket传来的数据
void onGetSocketData(String event, String data);
// 本地socket传来的数据
void onGetSocketLocalData(String event, String data);
}
C Socket定制协议
// 定制子类的协议
List<String> listUser = getAllPublicStaticFiledsValues(getClass());
// 关连协议,并绑定接口回调
for (final String string : listUser) {
mSocket.on(string, new Emitter.Listener() {
@Override
public void call(Object... args) {
String backData = "";
if (args.length > 0) {
backData = args[0].toString();
}
LogUitls.print("socket消息 -server-", string + " " + backData);
if (onGetSocketDataListener != null)
onGetSocketDataListener.onGetSocketData(string,
backData);
}
});
}
4 其它代码
A 子类的写法
怎么样感觉十分简洁吧,这里的好处就是只需要在实现类里,写上静态string量即可定制协议,且里面的静态量可以在外部使用
package com.example.sockettest;
/***
* create by liugd
* 视频直播socket
*/
public class MySocket extends EasySocketBase {
@Override
protected String setSocketUrl() {
return "http://192.168.1.107:5006";
}
public final static String ID_enterRoom = "enterRoom";// 进房间
}
B 在Activity中使用
在activity里面只需要实现EasySocketBase的回调即可接收socket的数据
package com.example.sockettest;
import android.app.Activity;
import android.os.Bundle;
import com.example.sockettest.EasySocketBase.onGetSocketDataListener;
public class MainActivity extends Activity {
MySocket mySocket = new MySocket();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySocket.setOnGetSocketDataListener(new onGetSocketDataListener() {
@Override
public void onGetSocketLocalData(String event, String data) {
if (MySocket.ID_EVENT_CONNECT.equals(event)) {
//连接成功
}
}
@Override
public void onGetSocketData(String event, String data) {
if (MySocket.ID_enterRoom.equals(event)) {
//进入房间
}
}
});
mySocket.startSocket();
//发送消息
mySocket.sendSocketMessage(MySocket.ID_enterRoom, "data");
}
@Override
protected void onDestroy() {
mySocket.stopSocket();
super.onDestroy();
}
}
5 附优快云下载地址
http://download.youkuaiyun.com/detail/u012990509/9736777