Dúvida conceitual - socket + thread

11 respostas
R

Pessoal,

Preciso criar um sisteminha que possui um ou mais terminais.

Os terminais conectam ao servidor e aguardam um número que deve ser exibido na tela.

O servidor aguarda as conexões e para cada nova conexão cria uma thread para tratar.

Dúvida: cada cliente necessariamente precisa ser uma thread ? ou apenas um mero cliente que fica em loop aguardando o valor a ser exibido via socket.

Valeu !

11 Respostas

ignacio83

Isso é para a Faculdade ou para o seu serviço?

Pergunto isso porque é muito mais fácil vc fazer isso com um servidor de aplicação (Tomcat,JBoss, Glassfish…) ao invés de programar toda a lógica de comunicação.

Mais respondendo a sua pergunta: Cada cliente deve possuir uma Thread que fique escutando/enviando as solicitações para o servidor, se não seu programa vai ficar parado aguardando uma mensagem.

R

Nem faculdade de serviço.

É um projeto que iremos disponibilizar para algumas pessoas utilizarem, neste caso, seria algo comercial.

F

Estou sendo pai de um sistema utilizando socket
usando TCP e para comunicacao. Para cada pedido ele processa
em um thread diferente.

ver socket

http://www.guj.com.br/article.show.logic?id=126

e thread

http://www.guj.com.br/article.show.logic?id=43

B

raschefelipe:
Pessoal,

Preciso criar um sisteminha que possui um ou mais terminais.

Os terminais conectam ao servidor e aguardam um número que deve ser exibido na tela.

O servidor aguarda as conexões e para cada nova conexão cria uma thread para tratar.

Dúvida: cada cliente necessariamente precisa ser uma thread ? ou apenas um mero cliente que fica em loop aguardando o valor a ser exibido via socket.

Valeu !

Essa é praticamente a definição cuspida e escarrada do que acontece em Servlets. A menos que queira implementar um servidor de aplicação no braço, por favor use um já feito. Se o problema são protocolos, não é só de HTTP que essas Servlets vivem.

R

Fiquei com uma dúvida no que se refere ao controle das threads clientes, no seguinte sentido.

  • Cada thread Cliente conecta no servidor, para isso elas devem sabem o IP e a porta.
  • Minha thread cliente e a thread servidor está se conectando via socket.

Gostaria que o cliente fique em “wait() ?” até que o servidor envie um string para que após seja impresso o valor (no cliente) e após imprimir permaneça em wait() até o proximo valor.

Mas pelo que estudei, seria necessário que a thread cliente tenha conhecimento da thread servidor, para que possar dar o comando “servidor.wait()”, certo ?

B

Se voce der um wait no servidor ele vai parar, e ninguem mais vai acessá-lo.

O que acontecerá é simples:

  1. Servidor escuta continuamente por requisições do cliente.
  2. Servidor recebe uma requisição.
  3. Servidor cria uma thread, passa a requisição para ela tratar.
  4. Servidor volta a escutar por mais requisições.
R

Bruno,

Eu entendi esta parte, acredito que não estou sendo claro. É o seguinte, eu ainda não sei como fazer com que os cliente recebem um String e após imprimir este String continuem aguardando novos strings.

Acredito que seja algo + - assim:

String texto_servidor = "InputStream" while (!texto_servidor.equals("")){ System.out.println(texto_servidor); texto_servidor = "InputStream"; }

O que eu imaginava é que fosse possivel dar um wait() aqui no cliente até que o servidor mande um string (neste caso o servidor daria um notifyAll), ao invés de fazer um loop verificando o conteúdo do string.
Então oq nao sei como fazer é exatamente este wait() no cliente, pois meu cliente desconhece a thread servidor, sacou ?

Existe alguma solução neste sentido ?

B

Os próprios tutoriais sockets da Sun sobre sockets tratam sobre esses assuntos de escuta, espera, etc. Já deu uma olhada?

http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html

http://java.sun.com/docs/books/tutorial/networking/sockets/index.html

R

Cara, show de bola. Era exatamente isso que eu procurava.

Já testei e deu td certo, ou seja, o cliente fica “escutando” as mensagens do servidor. Quando recebe algo toma uma ação.
Só falta alterar para que o servidor escute vários clientes, as isso ah tah dominado tb !

Valeu !

R

Vou postar aqui um exemplo aqui pra galera, a idéia é que um cliente receba a informação do servidor e imprima. Ele fica em um loop aguardando a informação.

package principal;

import java.net.*;   
import java.util.ArrayList;
import java.io.*;   

public class Servidor implements Runnable   
{   
     ServerSocket servidorSocket;   
  
     public Servidor(int porta) throws Exception{        	
        	servidorSocket = new ServerSocket(porta);  
        	servidorSocket.setReuseAddress(true);
        	new Thread(this).start();
        	System.out.println("Servidor ouvindo na porta: " + porta);     
	}   
  
     public void run(){
          try{   
        	  while(true){            	   
            	   ArrayList<ServidorAcao> listaTrataCliente = new ArrayList<ServidorAcao>();
            	   System.out.println("Aguardando conexões.");
            	   ServidorAcao serverAcao = new ServidorAcao(servidorSocket.accept());
            	   serverAcao.start();            	   
            	   listaTrataCliente.add(serverAcao);                  
               }     
          }catch(Exception e){  
        	  try {
				servidorSocket.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}        	  
              e.printStackTrace();   
              System.exit(1);   
          }   
     }   
     public static void main(String[] args){   
          try{   
               new Servidor(10000);
          }catch(Exception e){   
               e.printStackTrace();   
               System.exit(1);   
          }   
     }   
}
package principal;

import java.io.PrintWriter;
import java.net.Socket;

class ServidorAcao extends Thread{
	private Socket clienteSocket;   

	public ServidorAcao(Socket cSocket){   
		clienteSocket = cSocket;   
	}   

	public void run(){   
		try{ 
			
			PrintWriter out = new PrintWriter(clienteSocket.getOutputStream(), true);
			
        	out.println("Mensagem 1 - " + this.getName());
			Thread.sleep(1000);
			out.println("Mensagem 2 - " + this.getName());
			Thread.sleep(1000);
			out.println("Mensagem 3 - " + this.getName());
			Thread.sleep(1000);			
			
		}catch(Exception e){   
			e.printStackTrace();   
			System.exit(1);   
		}   
	}
}
package principal;

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

import util.LeArquivoINI;

public class SimulaCliente extends Thread   
{   
	private String server;   
	private int porta;   
	private BufferedReader in = null;

	public SimulaCliente(String server, int porta){   
		this.server = server;   
		this.porta = porta;   
	}   

	public static void main(String[] args){   
		try{   
			LeArquivoINI la = new LeArquivoINI("C:/temp/configuracoes.ini");
			String server = la.getIdentificador("servidor");   
			int porta = 10000;   
			int numeroDeClientes = 50;
			for(int i=0; i < numeroDeClientes; i++){
				new SimulaCliente(server, porta).start();
			}
		}catch(Exception e){
			e.printStackTrace();   
		}   
	}  

	public void run(){		
		try {
			
			Socket s = new Socket(server, porta);
			
            in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String fromServer = "";
            
            while ((fromServer = in.readLine()) != null) {            	
                System.out.println(fromServer);
                //if (fromServer.equals("Bye."))
                	//break;                
            }   
            
            in.close();
            s.close();            
            
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}   

}
Naum_Jefferson

Pessoal tou com uma duvida aqui, se alguem puder ajudar agradeço…

quando criamos um cliente temos que passar o ip do servido e o socket!!! mas esse ip so funciona se estiver na mesma rede ou pela internet funciona tambem?
e como faço pra conseguir para pegar na net?

vlw

Criado 14 de abril de 2009
Ultima resposta 2 de jun. de 2009
Respostas 11
Participantes 5