android studio安卓手机tcp通信打开app自动连接,连接失败自动重试8次
最近在做一個項目,項目其中一個需求是打開app自動連接tcp服務端,連接失敗后自動嘗試8次。嘗試成功繼續,不成功提示服務器未響應。
我想到了用多線程實現,其中一個用于顯示嘗試狀態,另一個線程循環嘗試socket=new Socket(),達到以下效果:
代碼如下:
連接tcp用tcp_conn();
private void tcp_conn(){socket=null;if(socket!=null) {if (socket.isConnected()) {system.out.println("已連接");}}else {socket = new Socket();SocketAddress socAddress = new InetSocketAddress(netAdress, port);try {socket.connect(socAddress, 1000);} catch (IOException e) {e.printStackTrace();}}}第一次連接失敗后調用ReConnect()
//此線程用于重連嘗試,cnt[0]為嘗試次數,rctime=8表示最大重連次數 private void ReConnect() {new Thread(new Runnable() {@Overridepublic void run() {//因為第一次連接使得socket!=null,所有此處沒報錯//如果socket沒有連接,循環嘗試,直到連接上或嘗試次數達到最大while (!socket.isConnected() && cnt[0] < rctime) {//調用tcp_conn();tcp_conn();try {//線程延時5秒,等待socket反應,socket連接比較耗時Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}//連接成功則跳出循環,cnt[0]=rctime+1為什么要等于它,往下看if (socket.isConnected()) {tv_setText("連接成功");cnt[0] = rctime + 1;//不再重連break;} else {//連接失敗,繼續嘗試cnt[0] += 1;System.out.println("連接失敗");}}}}).start();}另一個線程用于打印嘗試狀態,使用handler定時器,每隔1s檢查連接狀態,顯示到屏幕TextView tv_tip中
//當未連接或嘗試次數小于8:tv_tip.setText("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime + "\n");并繼續定時 //當嘗試次數==8:tv_tip.setText("服務器未響應,請確定服務器已打開");并使cnt[0]=1,繼續定時,以便下次進入時關閉定時器 //嘗試次數>8:關閉定時器,上面的連接成功后也使cnt[0]>8,以關閉定時器 Handler handler = new Handler();final Runnable runnable = new Runnable() {@Overridepublic void run() {//打開一個新的線程new Thread(new Runnable() {@Overridepublic void run() {if (!socket.isConnected() && cnt[0] < rctime) {tv_tip.setText("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime + "\n");handler.postDelayed(runnable, 1000);//每1s執行一次runnable.} else if (cnt[0] == rctime) {cnt[0] += 1;tv_tip.setText("服務器未響應,請確定服務器已打開");handler.postDelayed(runnable, 1000);//每兩秒執行一次runnable.} else {handler.removeCallbacks(runnable);}}}).start();}};將所以步驟封裝到SystemInit()
private void SystemInit() {new Thread(new Runnable() {@Overridepublic void run() {cnt[0] = 0;tcp_conn();handler.postDelayed(runnable, 1000);//每兩秒執行一次runnable.if (socket.isConnected()) {{Tip("連接成功", Toast.LENGTH_LONG);}} else {ReConnect();}}}).start();}然后在onCreate中調用:
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_tip = findViewById(R.id.tv_tip);SystemInit();}其他布局代碼就不貼出來了。
這只是實現了這一步功能,8次之后如果還沒連上難道就不行了嗎?還要重新打開app才能連?當然可以增加一個刷新按鈕,在按鈕點擊事件中再次調用SystemInit();
所以未連接時要嘗試8次,連接成功后跳出ReConnect和關閉定時器。8次后仍未連接放棄嘗試,關閉定時器。
驗證中,我先在網絡調試助手中關閉tcp服務端,打開app,app打印出連接失敗,嘗試重新連接 2/8,此時我打開tcp服務端,等一會后顯示連接成功。如果嘗試8次之后還沒成功,則顯示出“服務器未響應,請確定服務器已打開”。
將所有內容封裝成類,做了一些改動,UserTcp.java
使用時只需調用TcpInit();tv_tip是TextView控件,需自己定義
總結
以上是生活随笔為你收集整理的android studio安卓手机tcp通信打开app自动连接,连接失败自动重试8次的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀手机在HBuilderX中运行uni
- 下一篇: 计算机微课论文参考文献,教学教师论文,关