亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

返回連接的套接字返回空

返回連接的套接字返回空

偶然的你 2022-11-30 11:24:18
我正在嘗試在 android 上創建一個客戶端-服務器應用程序。我想要一個初始化套接字并將其返回給主類的類。我在創建和連接套接字時沒有任何問題(我的服務器正在正確處理連接)但是當我嘗試將創建的套接字返回到主類時它是空的。我錯過了什么?我試過使用 AsyncTask。這是主類的代碼:public class MainActivity extends AppCompatActivity {    private Socket socket;    private SocketHandler sH;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sH = new SocketHandler();        sH.start();        socket = sH.getSocket();        if(socket == null){             System.out.println("null");        }else{            System.out.println("not null");        }    }}這是初始化套接字的類的代碼:public class SocketHandler extends Thread {    private Socket socket;    public Socket getSocket(){        return socket;    }    @Override    public void run(){        try{            socket = new Socket("192.168.0.4", 9999);        }catch (IOException e){            e.printStackTrace();        }    }}
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

線程是并行運行的,這意味著不能保證你的套接字連接會立即完成,但你錯誤地假設并且你踩到了經典的競爭條件,因為此時你調用getSocket()連接仍在建立(但這個過程還沒有尚未完成),因此socket變量仍然null是在創建SocketHandler.

getSocket()您需要同步代碼,執行回調或(出于測試目的)在調用或讀取幾次之前稍等片刻(即在循環中+一些延遲/超時,除非套接字值不是null(但請注意,您需要期望null如果套接字連接失敗也是有效值)。

另外,如果在單獨的線程中創建,為什么要在主線程中讀取套接字?你不應該在那個線程中做所有的套接字工作嗎?


查看完整回答
反對 回復 2022-11-30
  • 1 回答
  • 0 關注
  • 81 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號