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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android studio安卓手机tcp通信打开app自动连接,连接失败自动重试8次

發布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

package com.example.menu_tst;import android.app.Activity; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.view.Gravity; import android.view.View; import android.widget.TextView; import android.widget.Toast;import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.lang.Runnable; import static android.widget.Toast.LENGTH_LONG;public class UserTcp extends Activity {public Socket socket = null;public final TextView tv_tip;final int[] cnt = {0};public final int rctime = 8;private Context context;public UserTcp(TextView tv_tip,Context context){super();this.tv_tip=tv_tip;this.context=context;}public void Tip(String str, int showTime) {Looper.prepare();Toast toast = Toast.makeText(context, str, showTime);toast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0); //設置顯示位置TextView v = (TextView) toast.getView().findViewById(android.R.id.message);toast.show();Looper.loop();}public void TcpInit() {new Thread(new Runnable() {@Overridepublic void run() {cnt[0] = 0;tcp_conn(context);handler.postDelayed(runnable, 1000);//每兩秒執行一次runnable.if (socket.isConnected()) {{Tip("連接成功", LENGTH_LONG);}} else {ReConnect(context);}}}).start();}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) {System.out.println("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime);//Tip("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime, Toast.LENGTH_LONG);// tv_tip.setText("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime + "\n");runOnUiThread(new Runnable() {@Overridepublic void run() {tv_tip.setText("連接失敗,嘗試重新連接:" + cnt[0] + "/" + rctime + "\n");}});handler.postDelayed(runnable, 1000);//每兩秒執行一次runnable.} else if (cnt[0] == rctime) {cnt[0] += 1;System.out.println("服務器未響應,請確定服務器已打開");runOnUiThread(new Runnable() {@Overridepublic void run() {tv_tip.setText("服務器未響應,請確定服務器已打開");}});handler.postDelayed(runnable, 1000);//每兩秒執行一次runnable.} else {//Tip("timer",Toast.LENGTH_SHORT);handler.removeCallbacks(runnable);}}}).start();}};public void ReConnect(Context context) {new Thread(new Runnable() {@Overridepublic void run() {while (!socket.isConnected() && cnt[0] < rctime) {tcp_conn(context);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}if (socket.isConnected()) {runOnUiThread(new Runnable() {@Overridepublic void run() {tv_tip.setText("連接成功");}});cnt[0] = rctime + 1;//不再重連break;} else {cnt[0] += 1;System.out.println("連接失敗");}}}}).start();}public void tcp_conn(Context context) {socket = null;if (socket != null) {if (socket.isConnected()) {Tip("已連接!!!", Toast.LENGTH_SHORT);}} else {socket = new Socket();int port = 6000;String netAdress = "192.168.1.7";SocketAddress socAddress = new InetSocketAddress(netAdress, port);try {socket.connect(socAddress, 1000);} catch (IOException e) {e.printStackTrace();}if(socket.isConnected()) {runOnUiThread(new Runnable() {@Overridepublic void run() {tv_tip.setText("連接成功");}});}}}public static View getRootView(Context context) {Activity activity = (Activity) context;return activity.getWindow().getDecorView().findViewById(android.R.id.content);} }

使用時只需調用TcpInit();tv_tip是TextView控件,需自己定義

總結

以上是生活随笔為你收集整理的android studio安卓手机tcp通信打开app自动连接,连接失败自动重试8次的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。