xtaddqqug 2023-03-22 22:20 采纳率: 100%
浏览 14
已结题

Android studio4.0.1中客户端tcp socket连接报错s.connect()报错,如何解决?(语言-java)

Android studio4.0.1中客户端tcp socket连接报错s.connect()报错。所有可能引起报错的因素均已经排除。


```java

    btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try{
                    //s=new Socket("192.168.1.105",8888);
                    s=new Socket();
                    SocketAddress socketAddr = new InetSocketAddress("192.168.1.105", 8888);
                    s.connect(socketAddr);
                    dout=new DataOutputStream(s.getOutputStream());
                    din=new DataInputStream(s.getInputStream());
                    dout.writeUTF("reg");
                    String msg=din.readUTF();
                    tv1.setText(msg);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
当执行s.connect()时抛出异常android.os.NetworkOnMainThreadException

```

  • 写回答

2条回答 默认 最新

  • 初见~ 2023-03-22 23:32
    关注

    这个异常是因为在主线程中进行了网络操作,而Android不允许在主线程中进行耗时的网络操作。解决方法是将网络操作放在子线程中进行。可以使用AsyncTask或者Thread来实现。
    使用AsyncTask的示例代码:

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new ConnectTask().execute("192.168.1.105", "8888");
        }
    });
    
    private class ConnectTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            try {
                String ip = params[0];
                int port = Integer.parseInt(params[1]);
                s = new Socket(ip, port);
                dout = new DataOutputStream(s.getOutputStream());
                din = new DataInputStream(s.getInputStream());
                dout.writeUTF("reg");
                String msg = din.readUTF();
                return msg;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                tv1.setText(result);
            }
        }
    }
    
    
    

    在上面的代码中,我们使用了AsyncTask来执行网络操作。在按钮的点击事件中,我们创建了一个ConnectTask实例,并调用execute方法来执行这个任务。execute方法会在子线程中执行doInBackground方法,该方法中进行网络操作。当网络操作完成后,会调用onPostExecute方法,在该方法中更新UI。注意,我们不能在doInBackground方法中更新UI,因为该方法是在子线程中执行的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月22日

悬赏问题

  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥15 对于这个问题的解释说明
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败