ServerSocket代码适用于PC,不适用于Android

时间:2016-02-09 17:57:26

标签: java android sockets serversocket

我有以下ServerSocket代码接受传入的客户端:

public class Network {

private Socket              socket = null;
private ServerSocket        serverSocket = null;
private OutputStream        outputStream = null;
private BufferedReader      reader = null;
private PrintWriter         writer = null;
private boolean             firstConnect = true;
private String              packet;
private static Thread       serverThread = null;

public Network() {
    serverThread = new Thread(ServerThread());
    serverThread.start();
}

private Runnable ServerThread() {

        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(1440);
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
        System.out.println("Listening for packets....");
        try {
            socket = serverSocket.accept();
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
        while (true) {
            try {
                socket = serverSocket.accept();
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();
                System.out.println("User connected: " + socket.getInetAddress());
            } catch (Exception e) {
                System.out.println("Error: " + e);
            }
        }
}


class CommunicationThread implements Runnable {
    private Socket clientSocket;
    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
        try {
            this.input = new BufferedReader(new InputStreamReader(
            this.clientSocket.getInputStream()));
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                String read = input.readLine();
                System.out.println(read);
            } catch (Exception e) {
                System.out.println("Error: " + e);
            }
        }
    }
}
}

此代码在PC上完美运行。但是,当在Android设备上运行时,它永远不会接受客户端。

我已经看过以下潜在问题:

  • linux上的最小端口是1024.我使用的是端口1440;
  • 端口1440未使用。服务器在PC上工作正常,而不是在android;
  • 问题不是我的特定设备或Android操作系统。我使用了Galaxy S4,Galaxy S6和Sony Z3 compact,所有这些都是从Android 4.3开始的不同操作系统版本;
  • 我在AndroidManifest中添加了“android.permission.INTERNET”;

为什么代码仍然无法在我的Android设备上运行?

3 个答案:

答案 0 :(得分:1)

您最有可能围绕创建ServerSocket吞噬了NetworkOnMainThreadException。然后,您将在接受连接的第二个和第三个捕获块中吞咽大量NPE。没有过度捕捉会帮助你在这里;)

在更大的层面上,当您在应用程序的主线程上执行I / O时,Android(默认情况下)并不喜欢它。查看Android Designing for Responsiveness上的指南。

最好的解决方案可能是创建自己的独立线程来处理这项工作。 AsyncTask是一个常见而简单的Android范例,您可以在主线程中执行工作,但它实际上非常适合这个:它的设计对于简短的后台任务,而不是像套接字监听那样长时间运行的任务。

答案 1 :(得分:1)

看起来你曾经accept过多次。您调用accept,成功应答第一个传入连接,然后您不执行任何操作,并在开始任何处理之前开始等待第二个连接。

这可能来自设备 - > PC由于某些时间或生命周期问题导致打开两个连接;我不确定。

答案 2 :(得分:1)

在您的客户端代码中使用192.168.171.18,它是您服务器的本地IP。使用与服务器侦听位置相同的端口。所以不要使用公共IP。