Android TCP wird nicht gelöscht, bis der Socket geschlossen wird

Ich habe verschiedene Implementierungen ausprobiert, um dies zu ermöglichen, und habe StackOverflow und Android-Entwickler nach einer Lösung durchsucht, bin jedoch nicht zu erfahren in der Programmierung und kann diesen Block nicht dazu bringen, dass Code ordnungsgemäß funktioniert.

Meine Absicht:

Dies befindet sich in einem Thread, der eine Schleife durchläuft, um zu überprüfen, ob eine outMessage vorhanden ist. Wenn dies der Fall ist, wird die Nachricht gesendet.Als nächstes wird geprüft, ob sich etwas im In-Stream befindet. Wenn dies der Fall ist, wird es an den Handler in meiner Hauptaktivität gesendet.Zuletzt wird 1 Sekunde lang geschlafen und dann erneut überprüft.Dadurch sollte es mir möglich sein, mehrmals zu lesen / schreiben, ohne den Socket schließen und öffnen zu müssen.

Problem:

Der Outstream wird erst gespült, wenn ich die Steckdose schließe. flush () scheint keine Wirkung zu haben.

Meine Anfrage:

Bitte posten Sie die Änderungen, die erforderlich sind, damit dieser Code wie oben beschrieben funktioniert. (Alle Anmerkungen zur Erklärung von WARUM sind sehr willkommen. Links zu ähnlichen Fragen / Antworten helfen mir beim Lernen, aber ich habe mir diese für ein paar angesehen Wochen und kann es einfach nicht zum Laufen bringen, also stellen Sie bitte sicher, dass Sie auch die geänderten Code-Anforderungen angeben, damit es wie oben beschrieben funktioniert.

Andere:

Ich frage mich, ob mein In-Stream und / oder Outstream nach Zeilenende-Zeichen suchen muss.Würde hier etwas wie TCP_NODELAY verwendet?Alle zusätzlichen Informationen, die gegeben werden können, werden sehr geschätzt. Ich möchte dieses Zeug gut lernen, kann aber derzeit nichts zum Laufen bringen.

Code:

 public void run() {                        
        while (connectionStatus == TCP_SOCKET_STATUS_CONNECTED) {
            try {   
                if (outMessage != null){
                   OutStream.writeBytes(outMessage);
                   OutStream.flush();           
                   outMessage = ("OUT TO SERVER: " + outMessage);           
                // socketClient.close();     
                   sendMessageToAllUI(0, MAINACTIVITY_SET_TEXT_STATE, "appendText" , outMessage);
                   outMessage = null;               
                } 
                if (InStream != null) {                     
                    String modifiedSentence = InStream.readLine();      
                    sendMessageToAllUI(0, MAINACTIVITY_SET_TEXT_STATE, "appendText" , "\n" + "IN FROM SERVER: " + modifiedSentence);
            }
            Thread.sleep(1000);
        } catch (IOException e) {               
            connectionLost();
            break;
        } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }                           
}

Der Thread, der den Socket erstellt:

public void run() {
        if(I) Log.i(LOGTAG, "Attempt Connection with IP: " + serverIP + " ...");
        setName("AttemptConnectionThread");
        connectionStatus = TCP_SOCKET_STATUS_CONNECTING;
        try {
            SocketAddress sockaddr = new InetSocketAddress(serverIP, port);
            tempSocketClient = new Socket(); // Create an unbound socket

            // This method will block no more than timeoutMs. If the timeout occurs, SocketTimeoutException is thrown.
            tempSocketClient.connect(sockaddr, timeoutMs);
            OutStream = new DataOutputStream(tempSocketClient.getOutputStream());
            InStream = new BufferedReader(new InputStreamReader(tempSocketClient.getInputStream()));
            socketClient = tempSocketClient;
            socketClient.setTcpNoDelay(true);
            connected(); 
        } catch (UnknownHostException e) {
            if(I) Log.i(LOGTAG,"     ...UnknownException e: e.getMessage() shows: " + e.getMessage());
            connectionFailed();
        } catch (SocketTimeoutException e) {
            if(I) Log.i(LOGTAG,"     ...SocketTimoutException e: e.getMessage() shows: " + e.getMessage());
            connectionFailed();
        } catch (IOException e) {
            if(I) Log.i(LOGTAG,"     ...caught on run()");
            // Close the socket
            try {
                tempSocketClient.close();
            } catch (IOException e2) {
                Log.e(LOGTAG, "unable to close() socket during connection failure", e2);
            }
            if(I) Log.i(LOGTAG,"     ...IOException e: e.getMessage() shows: " + e.getMessage());
            connectionFailed();
            return;
        }
    } 

Der Java-Server, den ich online gefunden habe und verwende, bis ich ihn auf den realen Server portiere:

public class Server {

private static String SERVERIP;

/**
 * @param args
 * @throws IOException
 */

public static void main(String[] args) throws IOException {
    String clientSentence;
    String capitalizedSentence;

    try {
        ServerSocket welcomeSocket = new ServerSocket(8888);
        getIp();
        System.out.println("Connected and waiting for client input!\n");

        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(
                    connectionSocket.getOutputStream());

            clientSentence = inFromClient.readLine();
            String ip = connectionSocket.getInetAddress().toString()
                    .substring(1);
            System.out.println("In from client (" + ip + "): "
                    + clientSentence);
            if (clientSentence != null) {
                capitalizedSentence = clientSentence.toUpperCase() + '\n';
                System.out.println("Out to client (" + ip + "): "
                        + capitalizedSentence);
                outToClient.writeBytes(capitalizedSentence + "\n");
            }

        }
    } catch (IOException e) {
        // if server is already running, it will not open new port but
        // instead re-print the open ports information
        getIp();
        System.out
                .println("Server connected and waiting for client input!\n");

    }
}

private static void getIp() {
    InetAddress ipAddr;
    try {
        ipAddr = InetAddress.getLocalHost();
        System.out.println("Current IP address : "
                + ipAddr.getHostAddress());

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage