Search code examples
androidsocketstcpserversocket

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


I'm beginer in android and i'm trying develop a connection TCP server.

I have this 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();
        }

I can send message normally in the first time, but when i try to send message the second time the software remains in line: socket = serverSocket.accept(); and the message in printWriter.println(msg) is not sent.

Additional Information

When i kill the app in settings and open i can send once.

Any questions don't hesitate ask me.

Thanks for all!


Solution

  • I solved my own problem.

    I wrote my class as the follow bellow code:

    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;
            }
        }
    
    }
    

    With this class you can send and receive tcp messages all the time.

    Thanks for all help!