Android(安卓)使用Socket实现服务器与手机客户端的长连接四:使用回调函数与Service调用
16lz
2021-01-26
1、改写原来客户端连接封装类,添加监听
/** * @描述 使用socket实现长连接 * @项目名称 App_Chat * @包名 com.android.chat.utils * @类名 TcpUtil * @author chenlin * @date 2012年6月26日 下午4:06:43 * @version 1.0 */public class ConnManager { protected static final int STATE_FROM_SERVER_OK = 0; private static String dsName = "192.168.31.239"; private static int dstPort = 10002; private static Socket socket; private static ConnManager instance; private ConnManager() { } public static ConnManager getInstance() { if (instance == null) { synchronized (ConnManager.class) { if (instance == null) { instance = new ConnManager(); } } } return instance; } /** * 连接 * * @return */ public boolean connect(final Handler handler) { if (socket == null || socket.isClosed()) { new Thread(new Runnable() { @Override public void run() { try { socket = new Socket(dsName, dstPort); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { throw new RuntimeException("连接错误: " + e.getMessage()); } try { // 输入流,为了获取客户端发送的数据 InputStream is = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { final String result = new String(buffer, 0, len); Message msg = Message.obtain(); msg.obj = result; msg.what = STATE_FROM_SERVER_OK; handler.sendMessage(msg); } } catch (IOException e) { throw new RuntimeException("getInputStream错误: " + e.getMessage()); } } }).start(); } return true; } /** * 连接 * * @return */ public void connect() { if (socket == null || socket.isClosed()) { try { socket = new Socket(dsName, dstPort); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { throw new RuntimeException("连接错误: " + e.getMessage()); } try { // 输入流,为了获取客户端发送的数据 InputStream is = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { final String result = new String(buffer, 0, len); if (mListener !=null) { mListener.pushData(result); } } } catch (IOException e) { throw new RuntimeException("getInputStream错误: " + e.getMessage()); } } } /** * 发送信息 * * @param content */ public void sendMessage(String content) { OutputStream os = null; try { if (socket != null) { os = socket.getOutputStream(); os.write(content.getBytes()); os.flush(); } } catch (IOException e) { throw new RuntimeException("发送失败:" + e.getMessage()); } } /** * 发送信息 * * @param auth */ public void sendAuth(String auth) { OutputStream os = null; try { if (socket != null) { os = socket.getOutputStream(); os.write(auth.getBytes()); os.flush(); } } catch (IOException e) { throw new RuntimeException("发送失败:" + e.getMessage()); } } /** * 关闭连接 */ public void disConnect() { if (socket != null && !socket.isClosed()) { try { socket.close(); } catch (IOException e) { throw new RuntimeException("关闭异常:" + e.getMessage()); } socket = null; } } public interface ConnectionListener{ void pushData(String str); } private ConnectionListener mListener; public void setConnectionListener(ConnectionListener listener){ this.mListener = listener; }}
2、创建Service, 在Service进行连接,在监听方法里使用PushReceiver广播把数据发送出去,通知界面更新
1)先创建广播PushReceiver
public abstract class PushReceiver extends BroadcastReceiver { public static final String ACTION = "com.java.chat.action"; public static final String DATA = "data"; }
2)创建服务
public class ConnService extends Service implements ConnectionListener{ private ConnManager mConnManager; @Override public IBinder onBind(Intent intent) { return null; } /** * 连接服务 */ @Override public void onCreate() { super.onCreate(); new Thread(new Runnable() { @Override public void run() { mConnManager = ConnManager.getInstance(); mConnManager.setConnectionListener(ConnService.this); mConnManager.connect(); //发送验证码 mConnManager.sendAuth("#A"); } }).start(); } @Override public void pushData(String data) { Intent intent = new Intent(); intent.setAction(PushReceiver.ACTION); intent.putExtra(PushReceiver.DATA, data); sendBroadcast(intent); }}
3、修改客户端
public class ClientActivity extends Activity { private EditText mEtContent; private ConnManager manager; private PushReceiver mPushReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); manager = ConnManager.getInstance(); mEtContent = (EditText)findViewById(R.id.et); initReceiver(); } private void initReceiver() { mPushReceiver = new PushReceiver() { @Override public void onReceive(Context context, Intent intent) { if (PushReceiver.ACTION.equals(intent.getAction())) { String response = intent.getStringExtra(PushReceiver.DATA); ToastUtil.show(ClientActivity.this, response); } } }; IntentFilter filter = new IntentFilter(PushReceiver.ACTION); registerReceiver(mPushReceiver, filter); } /** * 发送信息 * @param view */ public void clickMessage(View view){ if (mEtContent.getText()!= null) { manager.sendMessage(mEtContent.getText().toString()); } } /** * 断开连接 * @param view */ public void clickDisConnect(View view){ manager.disConnect(); } @Override protected void onDestroy() { manager.disConnect(); unregisterReceiver(mPushReceiver); super.onDestroy(); }}
———————————————————————
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
有需求者请进站查看,非诚勿扰
https://item.taobao.com/item.htm?spm=686.1000925.0.0.4a155084hc8wek&id=555888526201
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–
更多相关文章
- Android检测手机或PAD是否连网
- Android开发之连接MySQL数据库(一)
- Android(安卓)WiFi直连 双向通信
- [Android(安卓)GMS 认证] CTS 测试准备
- 赵雅智:Android短信发送器
- android网格连接
- 支付宝小程序(ble 适配android和ios) 入门一
- 谈谈Android中WIFI 架构和控制流程
- Android(安卓)Sensor 架构深入剖析