Socket Manter Conexão

3 respostas
R

Bom dia PortalJava...

estava eu estudando sobre Java e seus Sockets...
ta ok, fiz minha aplicação rodando em terminal, ficou perfeita, agora
estou desenvolvendo-a com Interface

o problema é o seguinte, no meu script 'Servidor' depois que o try torna-se true ou sejá quando eu recebo um chamado no cliente, eu recebo a mensagem dele, leio com o readline e tal tudo bem, ai ele vai pro finally, e da close na Conexão...

o que eu queria é o seguinte que ele não feche a conexão para que fique aberto para novas mensagems...

Como eu faria isso?
tenho que usat Thread para ficar dando loops e checando novas mensagems?

vou deixar o meu script de servidor que eu esta rodando em terminal para que dêem uma olhada:

import java.io.*;
import java.net.*;

public class Servidor {
	
	public static void statusDisplay(int status){
		if(status == 1){
			System.out.println("Servidor Estabelecido");
			System.out.println("Aguardando Cliente... \n");
		}else if(status == 0){
			System.out.println("\nConexao Fechada! \n");
		}
	}
	
	public static void main(String args[]){
		ServerSocket serv = null;
		Socket s = null;
		BufferedReader entrada = null;
				statusDisplay(1);
			try{
				serv = new ServerSocket(8010);
				s = serv.accept();
				
				entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
				System.out.println("Resposta do Cliente: " + entrada.readLine()); 	
			} catch (IOException e){
				System.out.println("Erro ao recebr o socket");
			} finally {
				try{
				statusDisplay(0);
				serv.close();
				s.close();
				} catch (IOException e){ }
			}
	}
}

então eu quero que mantenha a conexão, não sei se é asism que funciona os Sockets em JAVA se ele podê trabalhar com várias conexões ao mesmo tempo, podendo manter elas... ou se tem que fechar mesmo

mas mesmo que tenha que fecha, eu posso fazer algo pra que ele abra de novo meio que automaticamente. não? pois eu preciso receber novos dados...

Espero respostas ancioso, Abraços!

3 Respostas

R

Eu com o meu Mero conhecimento novato de Java tentei fazer
o que eu quero que seria algo mais ou menos assim, mas não esta funcionando, dê uma olhada:

/*
 * conexao.java
 *
 * Created on 25 de Janeiro de 2007, 02:57
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ssocket;
import java.io.*;
import java.net.*;

/**
 *
 * @author Rafael Capucho
 */
public class conexao extends Thread {
    public int ativo = 0;
    /** Creates a new instance of conexao */
    public conexao() {
    }
    
    public void para(){
        this.ativo = 1;
    }
    
    public void run(){
        ServerSocket serv = null;
	Socket s = null;
	BufferedReader entrada = null;
        try{
            while(ativo == 0){
                try{
                sleep((long)1.00);
                serv = new ServerSocket(8010);
                s = serv.accept();
                entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
                System.out.println(entrada.readLine());
                if(entrada.readLine() == "exit"){
                    this.ativo = 1;
                }
                } catch (InterruptedException e){}
            }
        }catch(IOException e){
        }finally{
            if(ativo == 1){
            try{
		serv.close();
		s.close();
		} catch (IOException e){ }
            }
        }
    }
    
    public void startCon(){
        //ServerSocket serv = null;
	//Socket s = null;
	//BufferedReader entrada = null;  
    }
    
}
R

Pronto consegui fazer manter, olha só, só tem eu online no fórum falando
sozinho aqui hehehe...

Bom, consigo manter o loop agora...
porem tenho outras duvidas

eu estou usando uma class Externa para Criar seria...

public class conexao extends Thread {

ai no código da página que tem o main, eu crio como OOP

conexao con = new conexao();

entendem?

certo... se eu estou usando os métodos em outra class como eu posso me referir a um componente que esta aqui la na outra eu imprimo o que vem assim...
System.out.println(entrada.readLine());

mas eu precisaria colocar o conteudo dentro de um TextArea, com setText não é mesmo?

como fazer referencia em páginas diferentes?

outra coisa, eu estou usando uma método para pausar (trocar o valor do while)... se na outra página eu chamar o Start dentro do main...
conexao con = new conexao();
        con.start();

como que eu posso fazer referencia a um actionPerform no tipo botão por exemplo, para chamar o método para()?

public void para(){
        this.ativo = 1;
    }

sendo que eu não posso chamar a classe novamente, pois criará um novo chamado da classe, sendo separado...então eu crio em new, e como posso re-utilizar em outro evento a mesma classe?

eu tentei algo do tipo
private void btnDesligaActionPerformed(java.awt.event.ActionEvent evt) {                                           
com.para();
    }

ele não entende que é referente a classe q eu chamei no Main...

O meu código é o seguinte:
/*
 * conexao.java
 *
 * Created on 25 de Janeiro de 2007, 02:57
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ssocket;
import java.io.*;
import java.net.*;

/**
 *
 * @author Rafael Capucho
 */
public class conexao extends Thread {
    public int ativo = 0;
    /** Creates a new instance of conexao */
    public conexao() {
    }
    
    public void para(){
        this.ativo = 1;
    }
    
    public void run(){
        ServerSocket serv = null;
	Socket s = null;
	BufferedReader entrada = null;
        while(ativo == 0){
            // Start Loop
            try{
            serv = new ServerSocket(8010);
            s = serv.accept();
            entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
            System.out.println(entrada.readLine());
            }catch(IOException e){}
            finally{
                try{
                    serv.close();
                    s.close();
                }catch(IOException e){}
            }
            // End Loop
        try{
                sleep((long)1000);
        } catch(InterruptedException e){}
    }
    }}

Espero respostas, abraços...

C
"RafaelCapucho":
Pronto consegui fazer manter, olha só, só tem eu online no fórum falando sozinho aqui hehehe...

Bom, consigo manter o loop agora...
porem tenho outras duvidas

eu estou usando uma class Externa para Criar seria...

public class conexao extends Thread {

ai no código da página que tem o main, eu crio como OOP

conexao con = new conexao();

entendem?

certo... se eu estou usando os métodos em outra class como eu posso me referir a um componente que esta aqui la na outra eu imprimo o que vem assim...
System.out.println(entrada.readLine());

mas eu precisaria colocar o conteudo dentro de um TextArea, com setText não é mesmo?

como fazer referencia em páginas diferentes?

outra coisa, eu estou usando uma método para pausar (trocar o valor do while)... se na outra página eu chamar o Start dentro do main...
conexao con = new conexao();
        con.start();

como que eu posso fazer referencia a um actionPerform no tipo botão por exemplo, para chamar o método para()?

public void para(){
        this.ativo = 1;
    }

sendo que eu não posso chamar a classe novamente, pois criará um novo chamado da classe, sendo separado...então eu crio em new, e como posso re-utilizar em outro evento a mesma classe?

eu tentei algo do tipo
private void btnDesligaActionPerformed(java.awt.event.ActionEvent evt) {                                           
com.para();
    }

ele não entende que é referente a classe q eu chamei no Main...

O meu código é o seguinte:
/*
 * conexao.java
 *
 * Created on 25 de Janeiro de 2007, 02:57
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ssocket;
import java.io.*;
import java.net.*;

/**
 *
 * @author Rafael Capucho
 */
public class conexao extends Thread {
    public int ativo = 0;
    /** Creates a new instance of conexao */
    public conexao() {
    }
    
    public void para(){
        this.ativo = 1;
    }
    
    public void run(){
        ServerSocket serv = null;
	Socket s = null;
	BufferedReader entrada = null;
        while(ativo == 0){
            // Start Loop
            try{
            serv = new ServerSocket(8010);
            s = serv.accept();
            entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
            System.out.println(entrada.readLine());
            }catch(IOException e){}
            finally{
                try{
                    serv.close();
                    s.close();
                }catch(IOException e){}
            }
            // End Loop
        try{
                sleep((long)1000);
        } catch(InterruptedException e){}
    }
    }}

Espero respostas, abraços...

seguinte...

Da pra fazer como se fosse um listener ou um observable, ou tbm com abstract (não sei se encaixa como listener)...

então bora lá...

class Principal {
	public void metodoQueAbreAConexao() {

		new Conexao() {
			public void onReadLine(String line) {
				metodoQueFazAlgoComALinha(line);
			}
		};
	}
	
	private void metodoQueFazAlgoComALinha(String line) {
		// e ble bli blu..
		System.out.println(line);
	}
}


abstract class Conexao extends Thread {
	
	public void run() {
		
		// fica lendo...
		// quando ler uma linha (loop)
		onReadLine(entrada.readLine());
	}
	
	public abstract void onReadLine(String line);
}

ou

class Principal implements MyListener {
	public void metodoQueAbreAConexao() {
		new Conexao(this); 
	}
	

	public void onReadLine(String line) {
//		 e ble bli blu..
		System.out.println(line);
	}
	
}


class Conexao extends Thread {
	
	private MyListener listener = null;
	
	public Conexao(MyListener listener) {
		this.listener = listener;
	}
	
	public void run() {
		// fica lendo...
		// quando ler uma linha (loop)
		listener.onReadLine(entrada.readLine());
	}
}

interface MyListener {
	public void onReadLine(String line);
}

ou ainda..

class Principal {
	public void metodoQueAbreAConexao() {
		new Conexao(new MyListener() {
		
			public void onReadLine(String line) {
//				 e ble bli blu..
				System.out.println(line);
			}
		
		}); 
	}
	

	
}


class Conexao extends Thread {
	
	private MyListener listener = null;
	
	public Conexao(MyListener listener) {
		this.listener = listener;
	}
	
	public void run() {
		// fica lendo...
		// quando ler uma linha (loop)
		listener.onReadLine(entrada.readLine());
	}
}

interface MyListener {
	public void onReadLine(String line);
}
Criado 25 de janeiro de 2007
Ultima resposta 25 de jan. de 2007
Respostas 3
Participantes 2