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

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日

悬赏问题

  • ¥100 基于 STM32F407ZET6 的音乐播放系统设计
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU
  • ¥30 51单片机C语言数码管驱动单片机为AT89C52
  • ¥100 只改动本课件的 cal_portfolio_weight_series(decision_date), 跑完本课件。设计一个信息比率尽量高的策略。
  • ¥20 如何在visual studio 2022中添加ImageMagick库
  • ¥50 如何实现uniapp编译的微信小程序做可回溯视频
  • ¥15 求Houdini使用行家,付费。价格面议。
  • ¥15 前端高拍仪调用问题报错
  • ¥15 想用octave解决这个数学问题