Primero, tanto el cliente como el servidor utilizan el método DataInputStream.readLine que está caducado en el JDK 1.1 porque no convierte correctamente los bytes en caracteres. La mayoría de los programas que uitilizan DataInputStream.readLine pueden hacer un cambio sencillo para utilizar el mismo método de la nueva clase BufferedReader. Simplemente reemplaza el código de:
con este:DataInputStream d = new DataInputStream(in);
En los dos programas se puede realizar este sencillo cambio.BufferedReader d = new BufferedReader(new InputStreamReader(in));
Segundo, tanto el cliente como el servidor crean explícitamente un PrintStream para escribir en el Socket. Utilizar un PrintStream ha sido anulado en favor de PrintWriter.
Por eso, aquí tienes las nuevas versiones de los programas que corrigen esos problemas:
import java.net.*;
import java.io.*;
class KnockKnockServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port: " + 4444 + ", " + e);
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: " + 4444 + ", " + e);
System.exit(1);
}
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter pw = new PrintWriter(
new BufferedOutputStream(clientSocket.getOutputStream(), 1024), false);
KKState kks = new KKState();
String inputLine, outputLine;
outputLine = kks.processInput(null);
pw.println(outputLine);
pw.flush();
while ((inputLine = br.readLine()) != null) {
outputLine = kks.processInput(inputLine);
pw.println(outputLine);
pw.flush();
if (outputLine.equals("Bye."))
break;
}
pw.close();
br.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class KnockKnockClient {
public static void main(String[] args) {
Socket kkSocket = null;
PrintWriter pw = null;
BufferedReader br = null;
try {
kkSocket = new Socket("taranis", 4444);
pw = new PrintWriter(kkSocket.getOutputStream());
br = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: taranis");
}
if (kkSocket != null && pw != null && br != null) {
try {
StringBuffer buf = new StringBuffer(50);
int c;
String fromServer;
while ((fromServer = br.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye."))
break;
while ((c = System.in.read()) != '\n') {
buf.append((char)c);
}
System.out.println("Client: " + buf);
pw.println(buf.toString());
pw.flush();
buf.setLength(0);
}
pw.close();
br.close();
kkSocket.close();
} catch (UnknownHostException e) {
System.err.println("Trying to connect to unknown host: " + e);
} catch (IOException e) {
System.err.println("IOException: " + e);
}
}
}
}
KKMultiServerThread que implementa un servidor de chistes Knock Knock que soporta múltiples conexiones KnockKnockClient y utiliza exactamente el mismo API caducado y también debe ser modificado de forma similar. Aquí tienes la nueva versión del JDK 1.1 del KKMultiServerThread.java:
import java.net.*;
import java.io.*;
class KKMultiServerThread extends Thread {
Socket socket = null;
KKMultiServerThread(Socket socket) {
super("KKMultiServerThread");
this.socket = socket;
}
public void run() {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter pw = new PrintWriter(
new BufferedOutputStream(socket.getOutputStream(), 1024), false);
KKState kks = new KKState();
String inputLine, outputLine;
outputLine = kks.processInput(null);
pw.println(outputLine);
pw.flush();
while ((inputLine = br.readLine()) != null) {
outputLine = kks.processInput(inputLine);
pw.println(outputLine);
pw.flush();
if (outputLine.equals("Bye"))
break;
}
pw.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}