Java cliente-servidor | servidor costuma receber segundo pedido
-
08-07-2019 - |
Pergunta
Eu estou tentando escrever um cliente e servidor de tempo para uma atribuição e eu estou tendo problemas para obter o servidor para receber o segundo pedido do cliente. O primeiro pedido passa bem sem um engate. então ele só barracas. Estou realmente muito perdido nesta coisa toda e bastante desconfortável com java ainda, então eu não tenho idéia do que estou ausente. Os ponteiros são muito apreciados. Obrigado!
Aqui está o código Sever:
import java.io.*;
import java.util.*;
import java.net.*;
import java.text.*;
public class myServer {
protected static final int PORT_NUMBER = 55555;
public static void main( String args[]) {
try {
ServerSocket servsock = new ServerSocket(PORT_NUMBER);
System.out.println("Server running...");
while(true) {
Socket sock = servsock.accept();
System.out.println("Connection from: " + sock.getInetAddress());
Scanner in = new Scanner(sock.getInputStream());
PrintWriter out = new PrintWriter(sock.getOutputStream());
String request = "";
request = in.next();
System.out.println("Request: " + request);
if(request.toUpperCase().equals("TIME")) {
out.println(getTime());
out.flush();
} else {
out.println("Invalid Request...");
out.flush();
}
}
} catch(Exception e) {
System.out.println(e.toString());
}
}
protected static String getTime() {
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
return (dateFormat.format(date));
}
}
Aqui está o cliente:
import java.io.*;
import java.util.*;
import java.net.*;
public class myClient {
protected static final String HOST = "127.0.0.1";
protected static final int PORT = 55555;
protected static Socket sock;
public static void main(String args[]) {
try {
sock = new Socket(HOST,PORT);
System.out.println("Connected to " + HOST + " on port " + PORT);
Scanner response = new Scanner(sock.getInputStream());
PrintWriter request = new PrintWriter(sock.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String txt = "";
while(!txt.toUpperCase().equals("EXIT")) {
System.out.print("prompt:");
txt = in.readLine();
request.println(txt);
request.flush();
System.out.println(response.next());
}
request.close();
response.close();
in.close();
sock.close();
} catch(IOException e) {
System.out.println(e.toString());
}
}
}
Solução
Você precisa ter o outro enquanto loop, algo como isto,
while(true) {
Socket sock = servsock.accept();
System.out.println("Connection from: " + sock.getInetAddress());
Scanner in = new Scanner(sock.getInputStream());
PrintWriter out = new PrintWriter(sock.getOutputStream());
String request = "";
while (in.hasNext()) {
request = in.next();
System.out.println("Request: " + request);
if(request.toUpperCase().equals("TIME")) {
out.println(getTime());
out.flush();
} else {
out.println("Invalid Request...");
out.flush();
}
}
}
Outras dicas
A partir do PrintWriter
docs :
... se rubor automática está habilitado será feito somente quando uma das
println
,printf
ou métodosformat
é invocado ...
O servidor está chamando print()
e nunca libera o fluxo, de modo que o tempo nunca é enviado. Ou println()
chamada ou explicitamente liberar o fluxo.
Além disso, o servidor fecha a conexão imediatamente após o envio do tempo, de modo segundo o pedido do cliente sempre falha ...
Editar: há uma peculiaridade interessante aqui - fechando o PrintWriter
deve para nivelá-lo (ver a especificação de Writer
), mas devido à ordem de operações que em < > parece para acontecer em vez disso é:
-
in.close()
fecha aSocket
subjacente -
out.close()
faria esvaziar os dados escritos, mas não pode (como o socket está fechado agora)
Não sei se este é exatamente o que está acontecendo, mas trocando a ordem destas duas afirmações altera o comportamento, presumivelmente dando out.close()
a oportunidade de nivelar ...