Android TCP nie opróżnia się, dopóki gniazdo nie zostanie zamknięte
Próbowałem różnych implementacji, aby ta praca działała, i przeszukałem StackOverflow i programistów Androida pod kątem rozwiązania, ale nie mam zbyt dużego doświadczenia w programowaniu i nie mogę uzyskać tego kodu, aby działał poprawnie.
Mój zamiar:
To jest w wątku, który będzie przechodził przez sprawdzanie, czy jest komunikat outMessage, jeśli tak, wyśle wiadomość.Następnie sprawdzi, czy jest coś w strumieniu, jeśli tak, to wyśle go do obsługi w mojej głównej działalności.Na koniec będzie spać przez 1 sekundę, a następnie sprawdź ponownie.Powinno to pozwolić mi na wielokrotne czytanie / zapisywanie bez konieczności zamykania i otwierania gniazda.Problem:
Outstream nie zostaje wypłukany, dopóki nie zamknę gniazda. flush () wydaje się nie mieć żadnego efektu.Moja prośba:
Opublikuj zmiany wymagane do poprawnego działania tego kodu, jak opisano powyżej (wszelkie adnotacje wyjaśniające DLACZEGO byłyby bardzo mile widziane. Linki do innych podobnych pytań / odpowiedzi byłyby świetne, aby pomóc mi się uczyć, ale patrzyłem na te dla pary tygodni i po prostu nie mogę go uruchomić, więc upewnij się, że również zmieniłeś ten kod, aby pracować zgodnie z powyższym opisem.Inny:
Zastanawiam się, czy mój instream i / lub outstream musi szukać znaków końca linii?Czy będzie tu używane coś takiego jak TCP_NODELAY?Wszelkie dodatkowe informacje, które można podać, będą bardzo mile widziane. Chcę dobrze się tego nauczyć, ale obecnie nie mogę nic zrobić.Kod:
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();
}
}
}
Wątek tworzący gniazdo:
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;
}
}
Serwer java, który znalazłem w Internecie i używam, dopóki nie przekażę go do prawdziwego serwera:
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();
}
}
}