You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Socket客户端无法连接PC服务器且闪退问题求助

问题分析与解决方案

看起来你踩了两个典型的坑:服务器端的连接处理逻辑有漏洞,再加上安卓客户端的网络操作线程限制,才导致了闪退。咱们一步步来解决:

一、先修复PC服务器端的代码问题

你目前的代码在accept()拿到客户端连接后立刻关闭了ServerSocket,这会导致刚建立的连接直接被切断,客户端那边肯定会因为连接意外中断而崩溃。而且你没有保留客户端的Socket来做后续通信,等于连接刚建立就失效了。

修正后的服务器代码参考(保留客户端Socket,不急于关闭ServerSocket,同时完善异常处理):

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {
    private ServerSocket server;
    private Socket client;

    public Socket listeningClient() {
        try {
            server = new ServerSocket(8080);
            System.out.println("等待客户端连接...");
            // 阻塞等待客户端连接
            client = server.accept();
            System.out.println("客户端已连接:" + client.getInetAddress());
            
            // 别立刻关闭ServerSocket!至少要在完成通信后再关闭
            // 这里模拟处理通信的时间,实际场景可以替换为读写数据的逻辑
            Thread.sleep(5000); 
            
            // 最后统一关闭资源
            client.close();
            server.close();
        } catch (Exception e) {
            e.printStackTrace(); // 打印完整异常栈,才能精准定位问题
        }
        return client;
    }

    public static void main(String[] args) {
        new SimpleServer().listeningClient();
    }
}

关键注意点

  • 不要在accept()后立刻关闭ServerSocket,要等与客户端的通信完成后再释放资源
  • 异常处理要打印完整栈轨迹,别只输出部分信息,否则根本找不到问题根源
  • 如果后续要支持多客户端,必须用线程处理每个连接,但单客户端场景至少要保持连接一段时间

二、安卓客户端闪退的核心原因:主线程网络操作

安卓从API 11开始,严格禁止在**主线程(UI线程)**中执行网络操作,否则会抛出NetworkOnMainThreadException,直接导致APP闪退——这大概率是你客户端崩溃的主要原因!

你必须把Socket连接逻辑放到子线程里,这里给个Java的简单实现示例:

import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "SocketClient";
    private static final String PC_IP = "你的PC局域网IP"; // 比如192.168.1.100
    private static final int PORT = 8080;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 启动子线程执行网络连接
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Log.d(TAG, "尝试连接服务器...");
                    Socket socket = new Socket(PC_IP, PORT);
                    Log.d(TAG, "成功连接服务器!");
                    
                    // 这里可以添加读写数据的逻辑
                    
                    // 用完记得关闭Socket
                    socket.close();
                } catch (Exception e) {
                    Log.e(TAG, "连接失败:", e); // 打印异常信息,方便排查
                }
            }
        }).start();
    }
}

额外配置要求

  • AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 确保PC和安卓设备在同一个局域网内,且PC防火墙没有拦截8080端口
  • 不要用localhost127.0.0.1作为PC的IP,必须用局域网IP(可在PC的CMD中输入ipconfig查看)

三、额外排查步骤

  • 先在PC上用telnet测试服务器是否正常:CMD输入telnet 你的PCIP 8080,能连接上再去测试安卓客户端
  • 查看安卓客户端的Logcat日志,搜索Exception关键词,确认具体的闪退原因(比如是线程问题还是连接超时)

内容的提问来源于stack exchange,提问作者silvio

火山引擎 最新活动