日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

安卓Socket处理

發(fā)布時(shí)間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓Socket处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
初學(xué)Android Socket 部分代碼參考于網(wǎng)絡(luò),結(jié)合項(xiàng)目測(cè)試后修改總結(jié),在此記錄。




1
/** 2 * <p> 3 * socket連接服務(wù) 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 /*讀接收數(shù)據(jù)線程*/ 21 private Thread readThread; 22 /*接收數(shù)據(jù)長(zhǎng)度*/ 23 private int rcvLength; 24 /*接收數(shù)據(jù)*/ 25 private String rcvMsg; 26 /* 讀取保存進(jìn)數(shù)組*/ 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地址,這里最好單獨(dú)建立一個(gè)存放數(shù)據(jù)類,用來(lái)存放網(wǎng)絡(luò)通訊使用到的數(shù)據(jù) 34 private String port;//端口號(hào) 35 private TimerTask task; 36 37 /*默認(rèn)重連*/ 38 private boolean isReConnect = true; 39 40 41 /* 線程狀態(tài),安全結(jié)束線程*/ 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 {//通過(guò)ServiceConnection獲取,后面會(huì)講解 54 /*返回SocketService 在需要的地方可以通過(guò)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 /*拿到傳遞過(guò)來(lái)的ip和端口號(hào)*/ 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 //啟動(dòng)讀取數(shù)據(jù) 88 connectThread = new Thread(new Runnable() { 89 @Override 90 public void run() { 91 socket = new Socket(); 92 try { 93 /*超時(shí)時(shí)間為20秒*/ 94 socket.connect(new InetSocketAddress(ip, Integer.valueOf(port)), 20000); 95 /*連接成功的話 發(fā)送心跳包*/ 96 if (socket.isConnected()) { 97 98 inputStream = socket.getInputStream(); 99 dis = new DataInputStream(inputStream); 100 101 if (inputStream != null) { 102 /* 開(kāi)啟讀寫線程 */ 103 threadStatus = true; 104 readThread = new ReadThread(); 105 readThread.start(); 106 } 107 108 /*因?yàn)門oast是要運(yùn)行在主線程的 這里是子線程 所以需要到主線程哪里去顯示toast*/ 109 // toastMsg("socket已連接111111111"); 110 111 /*發(fā)送心跳數(shù)據(jù)*/ 112 sendBeatData(); 113 } 114 115 } catch (IOException e) { 116 e.printStackTrace(); 117 if (e instanceof SocketTimeoutException) { 118 toastMsg("連接超時(shí),正在重連"); 119 releaseSocket(); 120 } else if (e instanceof NoRouteToHostException) { 121 toastMsg("該地址不存在,請(qǐng)檢查"); 122 stopSelf(); 123 } else if (e instanceof ConnectException) { 124 toastMsg("連接異常或被拒絕,請(qǐng)檢查"); 125 stopSelf(); 126 } 127 } 128 } 129 }); 130 /*啟動(dòng)連接線程*/ 131 connectThread.start(); 132 } 133 } 134 135 /*因?yàn)門oast是要運(yùn)行在主線程的 所以需要到主線程哪里去顯示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//測(cè)試時(shí)使用 150 */ 151 /*發(fā)送數(shù)據(jù)*/ 152 public void sendOrder(final String order, final String msg) { 153 if (socket != null && socket.isConnected()) { 154 /*發(fā)送指令*/ 155 new Thread(new Runnable() { 156 @Override 157 public void run() { 158 try { 159 Log.e("準(zhǔn)備回復(fù)消息:", msg); 160 outputStream = socket.getOutputStream(); 161 if (outputStream != null) { 162 outputStream.write(order.getBytes("gbk")); 163 outputStream.flush(); 164 Log.e("消息發(fā)送成功:", order); 165 } 166 } catch (IOException e) { 167 e.printStackTrace(); 168 //releaseSocket(); 169 Log.e("消息回復(fù)異常", msg); 170 } 171 } 172 }).start(); 173 } else { 174 Log.e(TAG, "socket連接錯(cuò)誤,請(qǐng)重試"); 175 releaseSocket(); 176 } 177 } 178 179 180 /** 181 * 發(fā)送連接狀態(tài)消息 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 * 發(fā)送連接狀態(tài)消息 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 * 接收數(shù)據(jù) 206 */ 207 private class ReadThread extends Thread { 208 @TargetApi(Build.VERSION_CODES.KITKAT) 209 @Override 210 public void run() { 211 super.run(); 212 //判斷進(jìn)程是否在運(yùn)行,更安全的結(jié)束進(jìn)程 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("收到服務(wù)器消息"); 221 //接收到數(shù)據(jù) 222 handleData(rcvMsg);//處理數(shù)據(jù)并回復(fù)服務(wù)器 223 } 224 } 225 } catch (Exception e) { 226 toastMsg("接收總控?cái)?shù)據(jù)異常"); 227 } 228 229 } 230 } 231 232 233 /*定時(shí)發(fā)送數(shù)據(jù)*/ 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 /*這里的編碼方式根據(jù)需求去改*/ 246 outputStream.write("這是一條心跳數(shù)據(jù)".getBytes("gbk")); 247 outputStream.flush(); 248 /*發(fā)送連接成功的消息*/ 249 //這里可以建立一條消息發(fā)送到Activity處理界面相關(guān) 250 } catch (Exception e) { 251 /*發(fā)送失敗說(shuō)明socket斷開(kāi)了或者出現(xiàn)了其他錯(cuò)誤*/ 252 toastMsg("連接斷開(kāi),正在重連"); 253 /*發(fā)送連接失敗的消息*/ 254 sendEventMsg(Constants.CONNET_FAIL, ""); 255 /*重連*/ 256 releaseSocket(); 257 e.printStackTrace(); 258 } 259 } 260 }; 261 } 262 263 timer.schedule(task, 0, 60000);//心跳每隔60000毫秒發(fā)送一次,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 * 服務(wù)器消息回復(fù) 317 * 318 * @param msg 319 * @param 320 */ 321 @TargetApi(Build.VERSION_CODES.KITKAT) 322 public void handleData(String msg) throws IOException { 323 sendOrder("確認(rèn)收到消息", 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 };

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/bbqopdd/p/10761639.html

總結(jié)

以上是生活随笔為你收集整理的安卓Socket处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。