Android安卓使用iosocket进行Socket通信简单封装优雅写代码

本文介绍了一种使用Java反射机制和接口回调技术封装网络Socket通信的方法,简化了代码编写过程并提高了协议定制的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值