Witam! Chciałbym prosić Was o pomoc. Mam program i potrzebuje do niego komentarzy, nie łapie o co chodzi dokładnie w wielu miejscach a komentarze były by bardzo pomocne. Czy mógłby ktoś pomoc mi i te komentarze umieścić... Program to klient i serwer, także składa się z dwóch części. Poniżej umieszczam cały listing. Byłbym bardzo wdzięczny za pomoc.

//klient

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.;
import java.net.
;

public class okno extends javax.swing.JFrame {
EchoKlient01 k = null;

public okno() {	//tworzenie nowego okna
    initComponents();
}

//@SuppressWarnings("unchecked")

private void initComponents() {

    jButton1 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jTextField1 = new javax.swing.JTextField();
    jButton2 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("Polacz");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jScrollPane1.setViewportView(jTextArea1);

    jButton2.setText("Wyslij");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jButton1)
                    .addGap(18, 18, 18)
                    .addComponent(jButton2)))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jButton1)
                .addComponent(jButton2))
            .addContainerGap())
    );

    pack();
}// default komponenty

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
//EchoKlient01 k = null;
try{
k = new EchoKlient01();
new Thread(new odbieranie(k.gniazdo)).start();

	} catch (IOException ex) {   //wyswietlanie wyjatku 
        System.out.println(ex);
             }finally{
	//	if(k!=null)k.zamknij();
	}

}//GEN-LAST:event_jButton1ActionPerformed

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
try {

        k.dzialaj();
    } catch (IOException ex) {//GEN-LAST:event_jButton2ActionPerformed
        System.out.println(ex);
    }

}

public class EchoKlient01{

private Socket gniazdo;
private BufferedReader in1;
private PrintStream out;

public EchoKlient01() throws IOException{
	this("localhost",7);
}

public EchoKlient01(String host, int port) throws IOException{
	gniazdo = new Socket(host,port);
	System.out.println("Polaczylismy sie z serwerem.");
	in1 = new BufferedReader(
		new InputStreamReader(gniazdo.getInputStream()));
	out = new PrintStream(gniazdo.getOutputStream());
	System.out.println("Strumienie ok.");	
           
    }

public void dzialaj() throws IOException{
	String s = "";
                    s= jTextField1.getText(); 	//pobieranie z obiektu textfield 
                    							//wprowodzonego napisu i przypisanie zmiennej s
		out.println(s); 	//wysylanie do serwera napisu
}

}

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new okno().setVisible(true);
        }
    });
}

public class odbieranie implements Runnable{ 
         private Socket gniazdo;
	public odbieranie(Socket g){
		gniazdo=g;}
            
    public void run() {
        try {
            BufferedReader in1 = new BufferedReader(
		new InputStreamReader(gniazdo.getInputStream()));
            String s = "";
          //  BufferedReader in2 = new BufferedReader(new InputStreamReader(System.in));
            while(!s.equals("q")){
           // System.out.print("Serwer: ");
            s = in1.readLine();
          //  out.println(s);
            jTextArea1.append("Serwer: " + s + "\n");
                         
            }jTextArea1.append("Polaczenie zakonczone.");
        } catch (IOException ex) {
            System.out.println(ex);
        }

    }
        
    }
    
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;

}


//serwer

import java.net.;
import java.io.
;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class EchoSerwer1{

private ServerSocket serwer;
private boolean koniec = false;
private int portSerwera = 7; //ustawienie portu na stale
    ArrayList<Obsluga> lista = new ArrayList<Obsluga>();

public EchoSerwer1(){
}

public EchoSerwer1(int port){
	portSerwera = port;
}

public void uruchom(){

	try{
		serwer = new ServerSocket(portSerwera);
		while(!koniec){
			System.out.println("Serwer: czekam na klienta");
			Socket gniazdo = serwer.accept();
			System.out.println("Serwer: jest klient");
                            Obsluga o = new Obsluga(gniazdo);
                            lista.add(o);
			new Thread(o).start(); //tworzenie nowego watku po polaczeniu klienta
		}
	}catch(IOException e){
		try{serwer.close();
		}catch(IOException ex){}
		System.out.println(e);
	}
				
}

public static void main(String[] args){
	
	EchoSerwer1 serwer = new EchoSerwer1();
	serwer.uruchom();
	
}

class Obsluga implements Runnable{
	private Socket gniazdo;
	public Obsluga(Socket g){
		gniazdo=g;
	}
           public void send(String s){
                PrintStream out;
                try {
                    out = new PrintStream(gniazdo.getOutputStream());
                    out.println(s);
                } catch (IOException ex) {
                        //Logger.getLogger(EchoSerwer1.class.getName()).log(Level.SEVERE, null, ex);
                        //System.out.println(ex);
                        
                }
                
            }
	public void run(){
		try{
                            BufferedReader in= 
			new BufferedReader(
				new InputStreamReader(gniazdo.getInputStream()));
			
				
			String s="";
			
			while(!s.equals("q")){  // petla while sprawdz czy klient nie wpisal q aby zakonczyc polaczenie
				s=in.readLine();
				System.out.println("Klient: "+s);
			 for(int i=0; i<lista.size();i++)
                                        lista.get(i).send(s);
			}System.out.println("Polaczenie zakonczone.\n");
				
		}catch(IOException e){
			System.out.println(e);					
		}finally{
			try{
			if(gniazdo!=null)gniazdo.close();
			}catch(IOException e){}
		}			
	}
}
	

}