ServerSocket.accept() 第二次不起作用

ServerSocket.accept() doesn't works in second time

我是 android 的新手,我正在尝试开发连接 TCP 服务器。

我有这个class:

public class JavaTCPServer {


public static void send(String aMessage) {

    final String msg = aMessage;

    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            Socket socket = null;
            try {

                ServerSocket serverSocket = GlobalSingleton.getInstance().getServerSocket();

                socket = serverSocket.accept();

                PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);

                printWriter.println(msg);

                printWriter.flush();
                printWriter.close();

            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {

                if (socket != null) {
                    try {

                        socket.close();
                        socket = null;
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }

            }
        }
    });

    thread.start();

}


}


private ServerSocket serverSocket; //Created in GlobalSingleton Class...


try {
            serverSocket = new ServerSocket(Constantes.TCP_PORT);
        } catch (IOException e) {
            e.printStackTrace();
        }

我第一次可以正常发送消息,但是当我第二次尝试发送消息时,软件仍然在线:socket = serverSocket.accept();并且printWriter.println(msg)中的消息没有发送。

附加信息

当我在设置中关闭应用程序并打开时,我可以发送一次。

任何问题都可以问我。

谢谢大家!

Serversocket.accept() 函数用于接受新的客户端并与客户端连接,对于消息,您需要在与服务器连接后使用 DataInputStream() 和 DataOutputStream() 。发生这种情况是因为服务器第一次接受新客户端并进一步处理,但在此之后它没有获得新连接并且它在 serversocket.accept().

等待新连接

您的代码只接受一个连接,处理它,然后退出。它的行为与您描述的不一样。

你需要一个循环。

您还需要启动一个单独的线程来处理每个连接。

并且调用一个接受连接的方法send()是从里到外,从后到前。

我解决了我自己的问题。

我把我的 class 写成下面的代码:

public class JavaTCPServer {

    private ServerSocket serverSocket;
    private String message;
    private Handler updateConversationHandler;
    private Thread serverThread = null;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public ServerSocket getServerSocket() {
        return serverSocket;
    }

    public void setServerSocket(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
    }

    public JavaTCPServer() {

        setUpdateConversationHandler(new Handler());
        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

    public Handler getUpdateConversationHandler() {
        return updateConversationHandler;
    }

    public void setUpdateConversationHandler(Handler updateConversationHandler) {
        this.updateConversationHandler = updateConversationHandler;
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(Constantes.TCP_PORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    socket = serverSocket.accept();
                    CommunicationThread commThread = new CommunicationThread(
                            socket);
                    new Thread(commThread).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;
        private BufferedReader input;
        private String messageSend;

        public CommunicationThread(Socket clientSocket) {
            this.clientSocket = clientSocket;

            try {
                this.setInput(new BufferedReader(new InputStreamReader(
                        this.clientSocket.getInputStream())));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {
            while (!Thread.currentThread().isInterrupted()) {

                Central central = GlobalSingleton.getInstance()
                        .get_current_central();

                if (central != null) {

                    if ((central.getStep() <= central.getObjetivo()) &&
                       (central.getStep() == 99)){

                        try {

                            messageSend = getMessage();

                            PrintWriter printWriter = new PrintWriter(
                                    clientSocket.getOutputStream(), true);

                            printWriter.println(messageSend);
                            printWriter.flush();
                            try {
                                Thread.sleep(1500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            printWriter.println(Constantes.EXIT_CONFIG);
                            printWriter.flush();
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        central.setStep(central.getStep() + 1);
                    }
                }

                /*
                 * try { String read = input.readLine();
                 * updateConversationHandler.post(new updateUIThread(read)); }
                 * catch (IOException e) { e.printStackTrace(); }
                 */
            }
        }

        public BufferedReader getInput() {
            return input;
        }

        public void setInput(BufferedReader input) {
            this.input = input;
        }
    }

}

有了这个class你就可以随时发送和接收tcp消息了。

感谢大家的帮助!