[JAVA] come fare una semplice chat in java - parte seconda

swing eventi e socket


In questo tutorial aggiungeremo qualche classe in più ovvero useremo le swing di java (premetto che le conosco pochissimo quindi ci potrebbero essere degli errori). i messaggi scambiati tra client e server verranno sempre stampati su consolle ma a differenza dei prog precedenti potremmo comunicare senza switch di controllo...mi spiego meglio sarà possibile mandare più messaggi di seguito grazie al gestore di eventi collegato al pulsante della finestra (cosa che non era possibile da consolle) .... se ricordate bene il programma precedente aveva sia dalla parte del client che dal server uno switch booleano che apriva lo stream di entrata e quello di uscita.
passiamo ora alle classi la prima classe sarà il nostro frame(ovvero le finestre con cui comunicheremo):

MioFrame:

import java.awt.*;

import javax.swing.*;

public class MioFrame extends javax.swing.JFrame {

public MioFrame(){

this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
this.setBounds(400,100,160,200);
this.setVisible(true);


}

}

come vedete importiamo sia awt che swing che rappresentano entrambe la parte grafica di java

MioPannello :

import java.awt.Color;


public class MioPannello extends javax.swing.JPanel {

public MioPannello() {
setSize(100,300);// costruttore mio pannello
setBackground(Color.YELLOW);

}

}

Questo è il pannello su cui agganceremo il pulsante la label e la textField

ora andiamo a creare il nostro pulsante:

Pulsante:

import java.awt.Color;


public class Pulsante extends javax.swing.JButton {

public Pulsante(){
this.setBackground(Color.RED);
this.setText("invia");
}

}

e infine la TextField

TextField :

import java.io.BufferedReader;
import java.io.InputStreamReader;



public class TextField extends javax.swing.JTextField {



public TextField(){
this.setText("Digita testo");
this.setSize(25, 25);

}

}

e ora il cuore del programma...ricordatevi che il primo a partire è sempre il server

SocketServer :

import java.net.*;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.io.*;

import javax.swing.JLabel;

public class SocketServer {

String Input;

Socket socket;

boolean cond = true;

DataOutputStream os;

String input;

TextField text;

MioFrame finestra;


public void manda(MouseEvent e) {


Pulsante pulsantecliccato = (Pulsante)e.getComponent();
MioPannello pannello = (MioPannello)pulsantecliccato.getParent();
Component[]listaComponenti = pannello.getComponents();
for(int i=0;i<listaComponenti.length;i++){
if(listaComponenti[i] instanceof TextField ){
TextField text = (TextField)listaComponenti[i];
input = text.getText();

}
}
try{
os.writeBytes(input + '\n');
}catch(IOException ec){
System.out.println("invio nn riuscito");

}
}



public void initComponent(){
finestra = new MioFrame();
MioPannello pannello = new MioPannello();
text = new TextField();
javax.swing.JLabel label = new JLabel("SERVER");
input = text.getText();
Pulsante puls = new Pulsante();

puls.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
manda(evt);
}
});

pannello.setLayout(new FlowLayout(FlowLayout.RIGHT,50,30));
pannello.add(label);
pannello.add(text);
pannello.add(puls);
finestra.add(pannello);
}


public void ascolto() throws Exception {

BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));//con questo decoratore leggo i dati in input


os = new DataOutputStream(socket.getOutputStream());//con questo mando l'outpit

this.initComponent();

while(true){

if (input.trim().equalsIgnoreCase("QUIT"))
break;

Input = is.readLine();// ricevo l'input dal client

System.out.println("dal client ho ricevuto: " + "\n" + Input); // stampo su consolle ciò ke ho ricevuto dal client
System.out.println("lettura avvenuta rispondi al client:");

}

cond = false; // quando esce dal ciclo infinito di output e di ascolto cond va a false così il serve si sconnette dopo ke il client gli ha mandato la conferma di uscita
os.close();// chiudo i decoratori
is.close();
socket.close();// chiudo la socket

}



public void Start()throws Exception {
try{

ServerSocket serverSocket = new ServerSocket(7777);// creo un istanza serversocket di tipo ServerSocket passando al costruttore la porta libera

while(cond){// quando cond è false il server si sconnette dal ciclo infinito di ascolto
System.out.println("server attivo in attesa di ricevere dati dal client");
socket = serverSocket.accept();// questo metodo mi ridà un valore di tipo socket e serve per accettare la connessione del client
this.ascolto();// quando il client si connette viene chiamato il metodo ascolto()

}

System.out.println("HAI SCONNESSO IL SERVER");
//finestra.setVisible(false);

}catch (IOException e){

System.out.println("accettazione nn venuta");
}
}



public static void main(String[] args) throws Exception {
SocketServer testserver = new SocketServer();
testserver.Start();

}

}

SocketClient :

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import javax.swing.JLabel;


public class SocketClient {


String Input;

DataOutputStream os;

String input;

TextField text;

MioFrame finestra;

public void manda(MouseEvent e) {


Pulsante pulsantecliccato = (Pulsante)e.getComponent();
MioPannello pannello = (MioPannello)pulsantecliccato.getParent();
Component[]listaComponenti = pannello.getComponents();
for(int i=0;i<listaComponenti.length;i++){
if(listaComponenti[i] instanceof TextField ){
TextField text = (TextField)listaComponenti[i];
input = text.getText();

}
}
try{
os.writeBytes(input + '\n');
}catch(IOException ec){
System.out.println("invio nn riuscito");

}
}


public void initComponent(){
finestra = new MioFrame();
MioPannello pannello = new MioPannello();
text = new TextField();
javax.swing.JLabel label = new JLabel("CLIENT");
input = text.getText();
Pulsante puls = new Pulsante();

puls.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(java.awt.event.MouseEvent evt){
manda(evt);
}
});

pannello.setLayout(new FlowLayout(FlowLayout.RIGHT,50,30));
pannello.add(label);
pannello.add(text);
pannello.add(puls);
finestra.add(pannello);
}

public void start() throws IOException{

Socket socket = new Socket("localhost", 7777);//creo l'istanza socket di tipo Socket e passo al costruttore l'indirizzo ip(del server) e la porta libera del server

os = new DataOutputStream(socket.getOutputStream());// apro uno stream di output per mandare dati al server


BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));// apro uno strem di lettura per ricever dati dal server

this.initComponent();


System.out.println("digita quello ke vuoi mandare al server");

System.out.println("per uscire e disconnettere il server digita quit :");

while (true) { // ciclo infinito di output e ascolto
Input =is.readLine();
if (Input.trim().equalsIgnoreCase("QUIT"))
break;
System.out.println("il serever ha risposto:" + "\n" + Input);
System.out.println("rispondi al server:");

}

System.out.println("sei uscito");
is.close();
os.close();
socket.close();

}




public static void main(String[] args) throws Exception {
SocketClient client = new SocketClient();
client.start();
}

}

Tutorial inserito da berserk80

 
fotoprofilo