Servidor Socket... Thread ----->> ME AJUDEM PLEEEEASE

Me ajudem por favor…

Estou fazendo um servidor para obter dados do sistema e envia-los para um cliente… ja fiz a GUI, blz… so que criei dois botões… ATIVA e DESATIVA… quando clico em ATIVA ele executa a trhead que contem o codigo do servidor… levanta o servidor na porta 6535 e ja tentei de tudo para matar a trhead e liberar o uso da porta 6535… se alguém poder me ajudar vou ficar grato… obrigado… Aqui vai uma parte do código…

class svr extends Thread{
public void run(){
String teste;
ServerSocket theServer;
Socket theConnection;
PrintStream p;
PrintStream d;
Properties props = System.getProperties();
String os_name = props.getProperty(“os.name”);
String os_versao = props.getProperty(“os.version”);
try {
theServer = new ServerSocket(6535);
try {
while (true) {
theConnection = theServer.accept();
p = new PrintStream(theConnection.getOutputStream());
p.println("-------------------");
p.println(“Sistema Operacional:\n” + os_name + “\n”);
p.println(“Versão:\n” + os_versao);
theConnection.close();
}}
catch (IOException e) {
theServer.close();
System.err.println(e);
}} catch (IOException e) {
lb2.setText(“Servidor ja ativado”);
}}}


ativa.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent actionEvent){
lb2.setText(“ATIVADO”);
new svr().start();
}});

                desativa.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent actionEvent){
                        info.setText("");
                        lb2.setText("DESATIVADO");
                        new svr().stop();
                    }});

Fala Augusto!!

Eu arrumei seu código aqui:

class svr extends Thread
{
	public void run()
	{
		String teste;
		ServerSocket theServer;
		Socket theConnection;
		PrintStream p;
		PrintStream d;
		Properties props = System.getProperties();
		String os_name = props.getProperty("os.name");
		String os_versao = props.getProperty("os.version");
		
		try 
		{
			theServer = new ServerSocket(6535);
			
			try 
			{
				while (true) 
				{
					theConnection = theServer.accept();
					p = new PrintStream
                                              (theConnection.getOutputStream());
					p.println("-------------------");
					p.println("Sistema Operacional:\n" + 
                                                     os_name + "\n");
					p.println("Versão:\n" + os_versao);
					theConnection.close();

				}
			}

			catch (IOException e) 
			{
				theServer.close();
				System.err.println(e);
			}
		}
	 	catch (IOException e) 
		{
			lb2.setText("Servidor ja ativado");
		}
	}
}


...

ativa.addActionListener(new ActionListener()
			         {
				      public void actionPerformed(ActionEvent                  actionEvent)
 				      {
					       lb2.setText("ATIVADO");
					       new svr().start();
				       }
			         } 
		                 );


desativa.addActionListener(new ActionListener()
			               {
				            public void actionPerformed(ActionEvent actionEvent)
				            {
					          info.setText("");
					          lb2.setText("DESATIVADO");
					          new svr().stop();
				            }
			               }
                                      );

Agora, você nunca vai conseguir fechar essa porta desse jeito, têm uma série de errinhos aí no código, porém nada muito grave.

O primeiro deles é que quando você cria uma nova thread (através do comando “new svr()” você está alocando memória para uma nova linha de processamento, sendo que ela não tem nenhum relacionamento com outras linhas que possam vir a ser criadas).

Então veja bem, quando você clica em ATIVA, cria-se uma thread do tipo SRV. Depois vc dá .start() e uma nova linha de execução irá rodar o conteúdo do método run() da classe SRV.

Quando depois vc clica em DESATIVA… Não está parando aquela primeira thread, e sim criando uma outra linha de execução que nada tem com a primeira. E pior ainda, está mandando essa linha que nem pensou em rodar, ser parada com o “.stop()”. Eu não sei se vc ganhou alguma exceção com isso…

A primeira coisa que tem de ser feita, é guardar a referência da thread. Ou seja, não só digitar “new srv()” mas “Thread minhaThread = new Srv();”. E depois guardar esta referência minhaThread em algum lugar.

Quando alguém clicar em DESATIVA, este método deve enxergar a minhaThread e se utilizar do comando “minhaThread.stop();”.

Aí nós garantimos que vc está lidando com uma única thread. Porém eu não tenho certeza de que matando a Thread você desaloca a porta, eu imagino que sim. Caso vc mate a thread e a porta continue aberta, basta criar um método na classe SRV que execute a linha “theConnection.close()” e chamá-lo antes de mandar a thread parar.

Veja se com isso o programa já funciona…

Abraços!

Bom, pelo qu eu entendi, você está com um problema para liberar a porta em questão…

… se for isso mesmo, veja bem… vc criou uma instancia de Socket e o inicializou, assim q vc dá um theServer.close() a porta em que você setou o server é liberada, diria quase que instantaneamente.

Espero ter ajudado em algo.

[]'s

Gabriel

Valeussss a dica Sr. rr_castaneda

Fiz como vc mandou, o problema é o seguinte, quando eu disparo 2 x o botão ativar ele gera uma exceção… tudo bem… tratei a exceção, mais o problema principal é o seguinte… qnd eu ativo, desativo e volto a ativar… o cliente já não consegue mais fazer conexão… :frowning: Mais valeu a dica… MUITO OBRIGADO!!!

Augusto MOTTA

Caramba…

Por essa eu não esperava… infelizmente não saberia dizer o que houve. =(

Fico feliz pelo menos por ter ajudado um pouco.

Abraço!