Problema com Sockets

4 respostas
FabricioPJ

Olá a todos, estou brincando um pouco com Sockets aqui. Tenho uma aplicação cliente-servidor bem básica onde o cliente se conecta no servidor e este envia mensagens ao cliente. Até ai tudo bem, o que esta ocorrendo é que quando passo meu código para um frame, ele trava. O problema em si ocorre no servidor, cuja conexão não é iniciada. Segue abaixo o código do botão que inicia o servidor:

try{
    txtEnviadas.setText("");
    txtEnviadas.append("Criando servidor...");
    ServerSocket servidor = new ServerSocket(1234);
    txtEnviadas.append("\nServidor operando na porta 1234");

    while(true){

        txtEnviadas.append("=======================================");
        txtEnviadas.append("       ESPERANDO CONEXÃO CLIENTE       ");
        txtEnviadas.append("=======================================");
        Socket cliente = servidor.accept();
        txtEnviadas.append("Conexão estabelecida por: [ " + cliente.getInetAddress().toString() + " ]");
        txtEnviadas.append("Enviando dados...");

        ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());
        saida.flush();

        saida.writeObject("Conectado ao servidor.");
        saida.writeObject("Dados conexao: " + cliente.toString());
        saida.writeObject("Saindo...");

        txtEnviadas.append("Dados enviados...");
        saida.writeObject("EOT");

        cliente.close();
        txtEnviadas.append("Conexão finalizada.");
    }
}
catch(Exception e){
    e.printStackTrace();
}

Quando clico nesse botão, o frame trava, tendo eu que finalizar o processo.

O código abaixo foi usado para criar um servidor, mas sem GUI, e funcionou perfeitamente com o cliente:

package principal;

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

public class Servidor{

    public static void main(String[] args) {

        try{

            System.out.println("Criando servidor...");
            ServerSocket servidor = new ServerSocket(1234);//Indica a porta 1234
            System.out.println("Servidor operando na porta 1234.");

            while(true){
                System.out.println("===Esperando conexão===");
                Socket cliente = servidor.accept();//Fica "escutando" uma conexao
                System.out.println("Conexão aberta de " + cliente.getInetAddress().toString());
                System.out.println("Enviando dados...");

                ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());
                saida.flush();

                //Dados a serem enviados ao cliente. Quando a classe "Cliente"
                //for executada, serão exibidas as mensagens abaixo para o cliente
                saida.writeObject("==========================================");
                saida.writeObject("Conectado ao servidor.");
                saida.writeObject("Dados conexao: " + cliente.toString());
                saida.writeObject("Saindo...");
                saida.writeObject("==========================================");

                System.out.println("Dados enviados.");
                saida.writeObject("EOT");

                cliente.close();
                System.out.println("Conexão encerrada.");
            }

        }
        catch(Exception e){
            e.printStackTrace();
        }

    }

}

Se alguém puder me ajudar, ficarei muito grato.

Boa tarde a todos.

4 Respostas

pmlm

Tentaste na mesma executar o cliente para ver se funciona?

FabricioPJ

Funciona sim, o cliente exibe as mensagens do servidor, mas se eu quiser digitar uma mensagem no servidor depois de te-lo iniciado, não dá pois este está travado. O que pode ser isso?

aurelio_silva

Quando o método accept() do ServerSocket é invocado, o processamento para nessa linha para aguardar que algum cliente solicite uma comunicação. Então, para não “travar” tudo, vc tem que invocar accept em uma thread separada…

V

Faca assim:

public void iniciaServer() {

    new Thread() {
         
       public void run() {
	   try{  
   
             System.out.println("Criando servidor...");  
             ServerSocket servidor = new ServerSocket(1234);//Indica a porta 1234  
             System.out.println("Servidor operando na porta 1234.");  
   
             while(true){  
                 System.out.println("===Esperando conexão===");  
                 Socket cliente = servidor.accept();//Fica "escutando" uma conexao  
                 System.out.println("Conexão aberta de " + cliente.getInetAddress().toString());  
                 System.out.println("Enviando dados...");  
   
                 ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());  
                 saida.flush();  
   
                 //Dados a serem enviados ao cliente. Quando a classe "Cliente"  
                 //for executada, serão exibidas as mensagens abaixo para o cliente  
                 saida.writeObject("==========================================");  
                 saida.writeObject("Conectado ao servidor.");  
                 saida.writeObject("Dados conexao: " + cliente.toString());  
                 saida.writeObject("Saindo...");  
                 saida.writeObject("==========================================");  
   
                 System.out.println("Dados enviados.");  
                 saida.writeObject("EOT");  
   
                 cliente.close();  
                 System.out.println("Conexão encerrada.");  
             }  
   
            } catch(Exception e){  
             e.printStackTrace();  
            }
      }

   }.start();

}

chame o metodo iniciarServer() no evento do botao.

Criado 4 de maio de 2009
Ultima resposta 4 de mai. de 2009
Respostas 4
Participantes 4