Como el nombre sugiere que el cliente envía al servidor nula. no puedo entender por qué
cliente Python
import socket
HOST = "localhost"
PORT = 5000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
dict = {
0: "doug",
1: "korg",
2: "stefan",
}
for x in range(0, 3):
if x == 3:
sock.sendall("Bye\n")
print(sock.recv(1024))
sock.sendall(b"{}\n".format(dict.get(x)))
print(dict.get(x))
print(sock.recv(1024))
servidor de Java:
public void run() {
String fromClient;
String toClient;
try {
ServerSocket server = new ServerSocket(5000);
System.out.println("wait for connection on port 5000");
boolean run = true;
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
while (run) {
System.out.println("got connection on port 5000");
fromClient = in.readLine();
System.out.println("received: " + fromClient);
if (fromClient.equals("Bye")) {
toClient = "Aight later man";
System.out.println("send eyB");
out.println(toClient);
client.close();
System.out.println("socket closed");
break;
}
out.println("cool next User Please");
}
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
mientras que las 3 primeras cuerdas están siendo envío desde el cliente al servidor y el servidor responde de vuelta, cuando Bye
se envía el servidor recibe nula y lanza una NullPointerException.
mi código se basa en este post. La comunicación entre el cliente y el servidor java pitón
el existir problema en String como cadena de bytes forma.
salida del servidor:
wait for connection on port 5000
got connection on port 5000
received: doug
got connection on port 5000
received: korg
got connection on port 5000
received: stefan
got connection on port 5000
Exception in thread "Thread-0" java.lang.NullPointerException
at Jserver.run(Jserver.java:28)
received: null
Process finished with exit code 0
salida del cliente:
doug
cool next User Please
korg
cool next User Please
stefan
cool next User Please
Su problema es causado en el código Python, que nunca envía el comando "bye".
El error en el código Python:
Sus bucles de código Python desde 0 (incluido) a 3 (exclusivo), ya que se excluye el 3, el código no entra en el bloque "adiós", y nunca envía esto. (X impresión para confirmar esto)
Coloque el "adiós" código después del bucle.
for x in range(0, 3):
sock.sendall(b"{}\n".format(dict.get(x)))
print(dict.get(x))
print(sock.recv(1024))
sock.sendall("Bye\n")
print(sock.recv(1024))
El error en el código de Java
Sí, también hay un error en el código de Java, sobre todo que no se ocupa de los cierres de corriente adecuada.
Cuando el programa de Python es estar apagado al final del código, el programa Java recibirá una salida limpia, esta es una manera excepción de menos de cerrar el zócalo, y dará lugar a readLine
devolver un valor nulo.
Este nula provoca entonces la siguiente excepción:
Exception in thread "Thread-0" java.lang.NullPointerException
Desde viendo un null
valor significa el socket está cerrado, también se puede enhebrar esta, ya sea como una respuesta adecuada "bye" o como una condición de error.
if (fromClient == null || fromClient.equals("Bye")) {