Proporciona el código original para una herramienta de chat escrita en Java, incluidos componentes del lado del servidor y del lado del cliente.
importar java.applet.*;
importar java.awt.*
importar java.io.*; java.net.*;
import java.awt.event.
clase pública ChatClient extiende Applet{
protected boolean loggedIn //estado de inicio de sesión
marco protegido cp; //marco de la sala de chat
protegido static int PORTNUM=7777; //número de puerto predeterminado 7777
protegido int puerto;
calcetín de socket protegido;
BufferedReader protegido es; // BufferedReader se usa para leer datos del calcetín
PrintWriter protegido pw // PrintWriter se usa para escribir datos en el calcetín
protected TextField tf; // TextField se utiliza para la entrada
protected TextArea ta;
protected String paintMessage; // mensaje publicado
public ChatParameter Chat;
public void init(){
paintMessage="Se está generando ventana de chat"
repaint(); Frame (TITLE);
cp.setLayout(new BorderLayout());
String portNum=getParameter("port"); //este parámetro no es demasiado explícito
public void init() {
paintMessage="Generando ventana de chat"
paintMessage="Generando ventana de chat"
cp= new; Frame(TITLE);
cp.
port=PORTNUM;
if (portNum!=null) //el libro es portNum==null, muy problemático
port=Integer.parseInt(portNum);
//CGI
ta=new TextArea(14, 80); ta.setEditable(false); //propiedades de solo lectura
ta.setFont(new Font("Monoespaciado
", Font.PLAIN, 11));
cp.setEnabled(false);
lob.setEnabled(true);
tf.requestFocus() ; // Ingrese la entrada del teclado en el cuadro de texto de la derecha
})
}.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent) e){
cerrar sesión();
lib.setEnabled(true);
lob.setEnabled(false); .requestFocus();
}
}.
});
p.add(nueva etiqueta ("Mensaje de entrada: "));
tf=new TextField(40);
tf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(loggedIn){
//pw.println(Chat.CMD_BCAST tf.getText()); ///Chat.CMD....esto ¿Qué es?
int j=tf.getText().indexOf(":");
if(jgt;0) pw.println(Chat.CMD_MESG tf.getText ( ));
else
pw.println(Chat.CMD_BCAST tf.getText(); ///Chat.CMD ¿Qué es?CMD_BCAST tf.getText());
tf.setText(""); // ¿No usas flush()?
}
}
}); /p>
p>
p.add(tf);
cp.add(BorderLayout.SOUTH, p);
cp.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e){
// Si se ejecuta setVisible o dispose, cierra la ventana
ChatClient.this.cp.setVisible (falso);
p>ChatClient.this.cp.dispose();
cerrar sesión(); );
cp.pack(); // No entiendo cuál es el punto de esto.
// Poner el marco cp en el medio
Dimensión us=cp.getSize(),
them=Toolkit.getDefaultToolkit().get
ScreenSize();
int newX=(ellos. ancho-us.width)/2
int newY=(ellos.
cp.setLocation( newX, newY);
cp.setVisible(true);
paintMessage="La ventana ahora debería estar visible"
repaint(); p>
}
//Inicie sesión en la sala de chat
public void login(){
if(loggedIn) return.
intente {
sock=new Socket(getCodeBase().getHost(), puerto
is=new BufferedReader(new InputStreamReader(sock. getInputStream())
pw=nuevo PrintWriter(sock. getOutputStream());
pw=nuevo PrintWriter(sock. getOutputStream());
pw=nuevo PrintWriter(sock.getOutputStream (), true);
}catch(IOException e){
showStatus("No se puede obtener el socket: " e); p> cp.add (new Label("No se puede obtener el socket: " e));
return;}
//C/Clock.getOutputStream(), verdadero) ;
Regresar.
//Construya e inicie el lector, lea los datos del servidor y envíelos al cuadro de texto
//Aquí, haga crecer el hilo para evitar el bloqueo.
Recurso(bloqueos)
nuevo hilo (nuevo Runnable(){
public void run(){
Línea de cadena;
probar {
while(loggedIn amp;amp;(( line=is.readLine())! =null)))
ta.appendText(line "\n"); /p>
}catch(IOException e){
showStatus("¡¡Dios mío, también corté la línea !!!!"); .CMD_LOGIN "AppletUser");
loggedIn =true;
}
// Código para imitar el cierre de sesión
cierre de sesión público vacío ( ){
if(! loggedIn)
return
loggedIn=false
intentar{
if(sock!=null)
sock.close();
}catch(IOException ign){