import java.io.* ;import java.net.* ;import java.util.*;public class EchoServer implements Runnable { public static final int PORT = 8000 ; Socket clientSocket; Vector <EchoServer> serverList; EchoServer(Socket clientSocket, Vector<EchoServer> v){ this.clientSocket = clientSocket; this.serverList = v; } public void run(){ try { // Obt�m os canais de entrada/sa�da do socket para // comunicar com o cliente InputStream is = clientSocket.getInputStream(); OutputStream os = clientSocket.getOutputStream() ; // Implementa a fun���o ECHO, copiando os dados da canal de entrada, // directamente, para o canal de sa�da, at� que o cliente feche a liga��o // Nota: o read retorna o n�mero de bytes lidos ou 0, // quando n�o h� mais nada para ler do canal de entrada do socket, // situa��o que resulta do socket ter sido fechado do outro lado // da liga��o... int n ; byte[] buf = new byte[1024] ; for(int i = 0; i < serverList.size(); i ++){ while( (n = is.read( buf )) > 0 ) os.write( buf, 0, n ) ; //Fecha e liberta o socket que usou para comunicar com o cliente... clientSocket.close(); } } catch (IOException e) {} } public static void main(String args[] ) throws Exception { // Cria o socket de atendimento do servidor, de onde // se aceitam as conex�es dos clientes ServerSocket serverSocket = new ServerSocket( PORT ) ; Vector<EchoServer> v = new Vector(); for(;;) { // ciclo infinito de atendimento // Espera at� que um cliente se ligue ao servidor, // retorna o socket para comunicar com o cliente Socket clientSocket = serverSocket.accept(); EchoServer xpto = new EchoServer(clientSocket, v);//mandar o socket e o vector v.add(xpto); for(int i = 0; i < v.size(); i ++){ Thread t = new Thread (v.get(i)); t.start(); } } }}