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日

悬赏问题

  • ¥15 ros的rviz仿真机器人
  • ¥15 关于#linux#的问题(输入输出错误):出现这个界面接着我重新装系统,又让修电脑的师傅帮我扫描硬盘(没有问题)用着用着又卡死(相关搜索:固态硬盘)
  • ¥15 cv::resize不同线程时间不同
  • ¥15 web课程,怎么做啊😭没好好听课 根本不知道怎么下手
  • ¥15 做一个关于单片机的比较难的代码,然后搞一个PPT进行解释
  • ¥15 python提取.csv文件中的链接会经常出现爬取失败
  • ¥15 数据结构中的数组地址问题
  • ¥15 maya的mel里,怎样先选择模型A,然后利用mel脚本自动选择有相同名字的模型B呢。
  • ¥15 Python题,根本不会啊
  • ¥15 会会信号与系统和python的来