为了账号安全,请及时绑定邮箱和手机立即绑定

返回连接的套接字返回空

返回连接的套接字返回空

偶然的你 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 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信