Chat client /1

Da Head First Java O'Reilly, capitolo 15. Networking e threads

Nel post precedente abbiamo visto un semplice chat server multithread. Ora vediamo il lato client.

La prima versione é molto semplice, serve più che altro a testare il server. Ci permette infatti solo di creare un messaggio e mandarlo al server.

La classe ChatClient costruisce una applicazione GUI minimale, i punti salienti del codice che vediamo a seguire sono nel metodo connect(), che stabilisce la connessione con il server (che deve essere in esecuzione!), e nella classe interna ButtonListener che mette a disposizione il metodo actionPerformed() che reagisce alla pressione del bottone:

package Chap15;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.*;

public class ChatClient {
JTextField message = new JTextField(20);
PrintWriter writer;

public ChatClient() {
JFrame frame = new JFrame("Chat Client");
JPanel panel = new JPanel();
JButton btnSend = new JButton("Send");
btnSend.addActionListener(new ButtonListener());

panel.add(message);
panel.add(btnSend);
frame.getContentPane().add(BorderLayout.CENTER, panel);

frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

connect();
}

private void connect() {
try {
Socket socket = new Socket("localhost", 4242);
writer = new PrintWriter(socket.getOutputStream());
System.out.println("Connected to chat server");
} catch(Exception ex) {
ex.printStackTrace();
}
}

private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String txt = message.getText();
System.out.println("Sending message: " + txt);
try {
writer.println(txt);
writer.flush();
} catch(Exception ex) {
ex.printStackTrace();
}

message.setText("");
message.requestFocus();
}
}

public static void main(String[] args) {
new ChatClient();
}
}

Nel metodo connect() creiamo un socket che cerca di connettersi alla macchina locale (localhost) sulla porta 4242. Se la connessione riesce creiamo un oggetto PrintWriter a partire dallo stream di output del socket nella variabile di istanza writer.
Il metodo actionPerformed() della classe interna ButtonListener, reagisce alla pressione del bottone leggendo il testo dalla input line e scrivendolo nel writer.

Nessun commento:

Posta un commento