Threads e Sockets

6 respostas
T

Comecei a fuçar nessas duas classes sem saber quase nada de Java e consegui algumas coisas depois de alguns testes. O programa compila mas parece que fica sempre em listen e nada acontece.

Será que alguém com paciência pra ler os códigos pode dar umas dicas?

public class Scan{

	public static void main(String[] args){
				
		ThreadClient cliente = new ThreadClient();
		ThreadServer servidor = new ThreadServer();
		servidor.start();
		cliente.run();		
		
		System.exit(0);
	}
}
import java.net.*;
import java.io.*;
import javax.swing.*;

public class ThreadClient extends Thread{

	private String msg;
	
	public ThreadClient() {
		super();
			
	}
	public void run(){
		Socket sock = null;
		PrintStream saida = null;
		
		try{
			sock = new Socket("127.0.0.1", 7000);
			
			saida = new PrintStream(sock.getOutputStream());
			
			msg=JOptionPane.showInputDialog("Envie uma menasgem:");
			
			saida.println(msg);
		}catch(IOException e){
			System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
		}
		finally{
			try{
				sock.close();				
			}catch (IOException e){e.printStackTrace();}			
		}
	}
}
import java.net.*;
import java.io.*;


public class ThreadServer extends Thread {

		public ThreadServer() {
		super();
	}

	public void run(){
		ServerSocket server=null;
		Socket sock = null;
		BufferedReader entrada = null;
		
		try {
			server = new ServerSocket(7000);	
			sock = server.accept();	
			entrada = new BufferedReader(new InputStreamReader(sock.getInputStream()));			
			System.out.println(entrada.readLine());
		} catch (IOException e) {			
			e.printStackTrace();
		}	
		finally{
			try{
				sock.close();
				server.close();
			}catch(IOException e){
				e.printStackTrace();
			}	
		}
		
		
	}
}

Valeu!

6 Respostas

danieldestro

Lembre-se que:

  thread.start( );  é que inicia a Thread.

  thread.run( );  apenas chama o método run, sem criar uma Thread.
T

Fiz alguns testes e consegui fazer funcionar uma vez usando o codigo ali de cima, ou seja, eu consigo mandar uma mensagem através dos sockets.

Queria que alguém dessde um ponto de partida pra que meu ThreadServer continuasse “escutando” e eu pudesse restartar a ThreadClient pra mandar mais mensagens.

Pensei em usar um loop com um thread.destroy(), mas ficou pouco OO acho eu.

Outra dúvida é por que tenho que chamar o run() da minha ThreadClient ao invés de chamar start(). Pelo que li nas Docs da API o start() chama o run() então eu usando o start() deveria funcionar, mas não funciona.

Valeu!

T

Será que ninguém pode me iluminar?

danieldestro

Pra você amigão, mel na chupeta:

public class Teste {

   public static void main(String[] args){

      ThreadClient cliente = new ThreadClient();
      ThreadServer servidor = new ThreadServer();
      servidor.start();
      cliente.start();
   } 
}
import java.net.*; 
import java.io.*; 
import javax.swing.*; 

public class ThreadClient extends Thread {

	private String msg; 
    
	public ThreadClient() { 
		super(); 
          
	}

	public void run(){ 
		Socket sock = null; 
		PrintStream saida = null; 
       
		try{
			while( true ) {
				sock = new Socket("127.0.0.1", 7000); 
				saida = new PrintStream(sock.getOutputStream()); 
				msg=JOptionPane.showInputDialog("Envie uma mensagem:"); 
				saida.println(msg);
				saida.close();
				sock.close();
			} //while()
		} catch(IOException e){ 
			System.out.println("Algum problema ocorreu ao criar ou enviar dados 

pelo socket.");
			e.printStackTrace(); 
		} 
		finally{ 
			try{ 
				sock.close();             
			} catch (IOException e){e.printStackTrace();}          
		} 
	} 
}
import java.net.*; 
import java.io.*; 


public class ThreadServer extends Thread { 

	public ThreadServer() {
		super();
	}

	public void run() { 
		ServerSocket server=null; 
		Socket sock = null; 
		BufferedReader entrada = null;
		String msg = null;

		try {
			server = new ServerSocket(7000);
			while( !"exit".equalsIgnoreCase( msg ) ) {
				sock = server.accept();    
				entrada = new BufferedReader(new InputStreamReader(sock.getInputStream()));  
				msg = entrada.readLine();        
				System.out.println( msg ); 
			} //while()

			System.out.println("Fim do programa");
			System.exit(0);
		} catch (IOException e) {
			e.printStackTrace(); 
		}    
		finally{ 
			try{ 
				sock.close(); 
				server.close(); 
			} catch(IOException e){ 
				e.printStackTrace(); 
			}    
		} 
	} 
}
T

3 dúvidas:

No MEU programa, porque tenho que iniciar o cliente através do run() sendo que o start() basicamente executa o run()?

O while(true) seria um laço infinito, certo?

No seu cliente Daniel, você executa o sock.close dentro de um try{} e dentro de um finally{} depois, uma vez só não é o bastante?

Valeu!

danieldestro

Precisar, não precisava… mas isso, em caso de Exceção levantada, no finally ele garante que o close( ) será executado.

LEMBRE-SE que:

executar o método run( ) não inicia a Thread, ele apenas executa o método run( ).

para iniciar a Thread, chame start( ).

Criado 6 de novembro de 2003
Ultima resposta 20 de nov. de 2003
Respostas 6
Participantes 2