初学Android Socket 部分代码参考于网络,结合项目测试后修改总结,在此记录。

  1 /**
  2  * <p>
  3  * socket连接服务
  4  */
  5 public class SocketService extends Service {
  6
  7     private static final String TAG = "SocketService";
  8
  9     /*socket*/
 10     private Socket socket;
 11     /*连接线程*/
 12     private Thread connectThread;
 13     private Timer timer = new Timer();
 14
 15
 16     /* 读写输入流*/
 17     private InputStream inputStream;
 18     private DataInputStream dis;
 19
 20     /*读接收数据线程*/
 21     private Thread readThread;
 22     /*接收数据长度*/
 23     private int rcvLength;
 24     /*接收数据*/
 25     private String rcvMsg;
 26     /* 读取保存进数组*/
 27     byte buff[] = new byte[1024 * 1024 * 2];
 28
 29     private OutputStream outputStream;
 30
 31
 32     private SocketBinder sockerBinder = new SocketBinder();
 33     private String ip;//IP地址,这里最好单独建立一个存放数据类,用来存放网络通讯使用到的数据
 34     private String port;//端口号
 35     private TimerTask task;
 36
 37     /*默认重连*/
 38     private boolean isReConnect = true;
 39
 40
 41     /* 线程状态,安全结束线程*/
 42     private boolean threadStatus = false;
 43
 44     private Handler handler = new Handler(Looper.getMainLooper());
 45
 46
 47     @Override
 48     public IBinder onBind(Intent intent) {
 49         return sockerBinder;
 50     }
 51
 52
 53     public class SocketBinder extends Binder {//通过ServiceConnection获取,后面会讲解
 54         /*返回SocketService 在需要的地方可以通过ServiceConnection获取到SocketService  */
 55         public SocketService getService() {
 56             return SocketService.this;
 57         }
 58     }
 59
 60     @Override
 61     public void onCreate() {
 62         super.onCreate();
 63     }
 64
 65
 66     @Override
 67     public int onStartCommand(Intent intent, int flags, int startId) {
 68
 69         /*拿到传递过来的ip和端口号*/
 70         ip = Constants.INTENT_IP;
 71         port = Constants.INTENT_PORT;
 72
 73         Log.e(TAG, "000" + DeviceUuidFactory.getUuid());
 74
 75         /*初始化socket*/
 76         initSocket();
 77
 78         return super.onStartCommand(intent, flags, startId);
 79     }
 80
 81
 82     /*初始化socket*/
 83     private void initSocket() {
 84
 85         if (socket == null && connectThread == null) {
 86
 87             //启动读取数据
 88             connectThread = new Thread(new Runnable() {
 89                 @Override
 90                 public void run() {
 91                     socket = new Socket();
 92                     try {
 93                         /*超时时间为20秒*/
 94                         socket.connect(new InetSocketAddress(ip, Integer.valueOf(port)), 20000);
 95                         /*连接成功的话  发送心跳包*/
 96                         if (socket.isConnected()) {
 97
 98                             inputStream = socket.getInputStream();
 99                             dis = new DataInputStream(inputStream);
100
101                             if (inputStream != null) {
102                                 /* 开启读写线程 */
103                                 threadStatus = true;
104                                 readThread = new ReadThread();
105                                 readThread.start();
106                             }
107
108                             /*因为Toast是要运行在主线程的  这里是子线程  所以需要到主线程哪里去显示toast*/
109 //                            toastMsg("socket已连接111111111");
110
111                             /*发送心跳数据*/
112                             sendBeatData();
113                         }
114
115                     } catch (IOException e) {
116                         e.printStackTrace();
117                         if (e instanceof SocketTimeoutException) {
118                             toastMsg("连接超时,正在重连");
119                             releaseSocket();
120                         } else if (e instanceof NoRouteToHostException) {
121                             toastMsg("该地址不存在,请检查");
122                             stopSelf();
123                         } else if (e instanceof ConnectException) {
124                             toastMsg("连接异常或被拒绝,请检查");
125                             stopSelf();
126                         }
127                     }
128                 }
129             });
130             /*启动连接线程*/
131             connectThread.start();
132         }
133     }
134
135     /*因为Toast是要运行在主线程的   所以需要到主线程哪里去显示toast*/
136     private void toastMsg(final String msg) {
137
138         handler.post(new Runnable() {
139             @Override
140             public void run() {
141                 Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
142             }
143         });
144     }
145
146
147     /**
148      * @param order
149      * @param msg//测试时使用
150      */
151     /*发送数据*/
152     public void sendOrder(final String order, final String msg) {
153         if (socket != null && socket.isConnected()) {
154             /*发送指令*/
155             new Thread(new Runnable() {
156                 @Override
157                 public void run() {
158                     try {
159                         Log.e("准备回复消息:", msg);
160                         outputStream = socket.getOutputStream();
161                         if (outputStream != null) {
162                             outputStream.write(order.getBytes("gbk"));
163                             outputStream.flush();
164                             Log.e("消息发送成功:", order);
165                         }
166                     } catch (IOException e) {
167                         e.printStackTrace();
168                         //releaseSocket();
169                         Log.e("消息回复异常", msg);
170                     }
171                 }
172             }).start();
173         } else {
174             Log.e(TAG, "socket连接错误,请重试");
175             releaseSocket();
176         }
177     }
178
179
180     /**
181      * 发送连接状态消息
182      *
183      * @param constants
184      */
185     private void sendEventMsg(String constants) {
186         EventMsg msg = new EventMsg();
187         msg.setTag(constants);
188         EventBus.getDefault().post(msg);
189     }
190
191     /**
192      * 发送连接状态消息
193      *
194      * @param constants
195      */
196     private void sendEventMsg(String constants, String rcvMsg) {
197         EventMsg msg = new EventMsg();//EventMsg的使用自行百度
198         msg.setTag(constants);
199         msg.setMsg(rcvMsg);
200         EventBus.getDefault().post(msg);
201     }
202
203
204     /**
205      * 接收数据
206      */
207     private class ReadThread extends Thread {
208         @TargetApi(Build.VERSION_CODES.KITKAT)
209         @Override
210         public void run() {
211             super.run();
212             //判断进程是否在运行,更安全的结束进程
213             try {
214                 while (!socket.isClosed() && threadStatus && ((rcvLength = dis.read(buff)) != -1)) {
215
216                     Log.e(TAG, "buff:" + buff);
217
218                     if (rcvLength > 0) {
219                         rcvMsg = new String(buff, 0, rcvLength, "GBK");
220                         toastMsg("收到服务器消息");
221                         //接收到数据
222                         handleData(rcvMsg);//处理数据并回复服务器
223                     }
224                 }
225             } catch (Exception e) {
226                 toastMsg("接收总控数据异常");
227             }
228
229         }
230     }
231
232
233     /*定时发送数据*/
234     private void sendBeatData() {
235         if (timer == null) {
236             timer = new Timer();
237         }
238
239         if (task == null) {
240             task = new TimerTask() {
241                 @Override
242                 public void run() {
243                     try {
244                         outputStream = socket.getOutputStream();
245                         /*这里的编码方式根据需求去改*/
246                         outputStream.write("这是一条心跳数据".getBytes("gbk"));
247                         outputStream.flush();
248                         /*发送连接成功的消息*/
249                         //这里可以建立一条消息发送到Activity处理界面相关
250                     } catch (Exception e) {
251                         /*发送失败说明socket断开了或者出现了其他错误*/
252                         toastMsg("连接断开,正在重连");
253                         /*发送连接失败的消息*/
254                         sendEventMsg(Constants.CONNET_FAIL, "");
255                         /*重连*/
256                         releaseSocket();
257                         e.printStackTrace();
258                     }
259                 }
260             };
261         }
262
263         timer.schedule(task, 0, 60000);//心跳每隔60000毫秒发送一次,60s
264     }
265
266
267     /*释放资源*/
268     private void releaseSocket() {
269
270         if (task != null) {
271             task.cancel();
272             task = null;
273         }
274         if (timer != null) {
275             timer.purge();
276             timer.cancel();
277             timer = null;
278         }
279
280         if (outputStream != null) {
281             try {
282                 outputStream.close();
283
284             } catch (IOException e) {
285                 e.printStackTrace();
286             }
287             outputStream = null;
288         }
289
290         if (socket != null) {
291             try {
292                 socket.close();
293
294             } catch (IOException e) {
295             }
296             socket = null;
297         }
298
299         if (connectThread != null) {
300             connectThread = null;
301         }
302
303         if (readThread != null) {
304             readThread = null;
305         }
306
307         /*重新初始化socket*/
308         if (isReConnect) {
309             initSocket();
310         }
311
312     }
313
314
315     /**
316      * 服务器消息回复
317      *
318      * @param msg
319      * @param
320      */
321     @TargetApi(Build.VERSION_CODES.KITKAT)
322     public void handleData(String msg) throws IOException {
323         sendOrder("确认收到消息", msg);
324     }
325
326
327     @Override
328     public void onDestroy() {
329         super.onDestroy();
330         Log.i("SocketService", "onDestroy");
331         isReConnect = false;
332         threadStatus = false;
333         releaseSocket();
334     }
335 }
IBinder 使用方法
 1  ServiceConnection serviceConnection = new ServiceConnection() {
 2                              @Override
 3                              public void onServiceConnected(ComponentName name, IBinder service) {
 4                                  SocketService.SocketBinder socketBinder = (SocketService.SocketBinder) service;
 5                                  socketBinder.getService().
 6                              }
 7
 8                              @Override
 9                              public void onServiceDisconnected(ComponentName name) {
10
11                             }
12                         };

 

转载于:https://www.cnblogs.com/bbqopdd/p/10761639.html

安卓Socket处理相关推荐

  1. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制...

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  2. android socket通信如何抓取,安卓Socket通信实例(客户端、服务端)

    安卓Socket通信实例 本文摘自:https://whatsblog.icu/index.php/Android/17.html 1.Socket通信必须知道的地方 1.首先,Socket通信采用T ...

  3. Java高级补充(Socket服务端、客户端)、Handler类、安卓Socket传数据、WebView

    Socket服务端简单地API: 主要用到以下几个API:ServerSocket用来设置端口号.accept用来和服务端连接.getInputStream用来获取输入流.read用来读取输入流里面的 ...

  4. 安卓Socket与pc端c#服务器的通信 附完整代码

    一.前言 小生不才,学习安卓socke通信打了很多滚,遇到过很多问题,也翻过前辈们关于socket的讲解,很杂各有见解,案例也不是很完整,于是特地将此安卓Socket与pc端c#服务器的通信代码讲解与 ...

  5. Windows PC和安卓Socket通信,附完整Demo。

    前言:由于要实现将安卓相机的预览数据在PC上处理,所以想到的就是通过socket方式进行通信,PC端采用c#实现.实际测试发现要想高速传输还是有难度,即使用千兆网,目前效果还是不理想.每帧1.5MB的 ...

  6. Android发送接收WiFi,安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt...

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片 ...

  7. 安卓Socket仿微信 群聊聊天工具 带源码教程

    涉及到的知识点: 1.9.png的使用,这个用来做气泡的 2.RecyclerView滑动组建的使用,貌似要勾选Android 7.0才能使用 之前一直勾8.0折腾了很久 3.Socket连网通信 4 ...

  8. 安卓Socket通信案例

    本案例是实现编写客户端负责发送内容.服务器端用来接收内容的程序. 1.编写服务器端程序(hello.java) 该程序是负责接收数据,需要单独编译运行.可以采用eclipse编译,编译之后将文件保存在 ...

  9. 安卓网络编程(Socket、WebView控件)

    目录 JavaSocket服务端开发 JavaSocket客户端开发 安卓Socket客户端开发 接收消息显示到控件上(解决安卓线程无法修改控件问题) Android网络接收数据并刷新界面显示 安卓w ...

最新文章

  1. C#基础篇--文件(流)
  2. U型管铁球或将代替现代火箭喷射装置
  3. UA MATH564 概率论 高阶矩的计算:有限差算子方法2
  4. oracle 怎么判断是不是第一条记录_怎么判断自己是不是阳痿呢?防治阳痿的5个方法值得一试...
  5. python如何创建模块教程_Python创建模块及模块导入的方法
  6. leetcode 316. Remove Duplicate Letters | 316. 去除重复字母(单调栈解法)
  7. Python学习6——条件,循环语句
  8. zend optimizer php5.5,PHP_PHP5.3以上版本安装ZendOptimizer扩展,现在很多PHP程序都需要ZendOptimi - phpStudy...
  9. RESTful最佳实践
  10. MFC中使用自定义消息 .
  11. SharePoint2013 App 开发中 自定义网站栏,内容类型,列表。
  12. DoS攻击之Syn洪泛攻击原理及防御
  13. 实验室设备管理系统的设计与实现程序设计与实现
  14. php 方法名前加 amp,PHP的返回引用(方法名前加)
  15. 万物互联的灵鹫山,取经的华为
  16. 高通物联网智能WIFI芯片-QCA4002/QCA4004
  17. uni-app 161朋友圈查看权限
  18. 《ffmpeg basics》中文版 -- 16.数字音频
  19. arm-linux-g++: command not found,解决Linux “g++: Command not found”报错问题 | 老左笔记
  20. tomcat 7.0

热门文章

  1. Qcon出品全球软件开发者大会北京站-低代码实践与应用
  2. 阿里 RocketMQ 如何让双十一峰值之下 0 故障?
  3. ​我们的系统需要什么样的分布式锁?
  4. 如何提升代码可读性?阿里发布16条设计规约
  5. HTML提交弹出提交中,javascript – 从弹出窗口在父窗口中提交表单?
  6. 玩家为何沉迷于游戏?《密教模拟器》中的“上瘾体验”设计
  7. unity实用技术:色盲玩家也能享受好的游戏体验
  8. MYSQL慢日志探索
  9. MySQL 数据格式化
  10. 安装完Oracle 11g之后启动SQL Developer 时报cannot find a j2se sdk错误的解决办法