Classe main abrindo ServerSocket e lendo dados

4 respostas
cotts

Olá pessoal, boa noite, estou há um tempo tentando fazer isso mas acho que o único lugar onde devo conseguir é aqui… estou quebrando a cabeça para fazer uma aplicação que um servidor leia uma string na rede e jogue o dado num jLabel. Quer dizer, conseguir fazer até eu já consegui, mas queria fazer com que ele inicializasse o servidor à partir de uma outra classe, uma com a interface gráfica e outra só com o ServerSocket, ai ele ficaria em execução e a classe principal que roda a parte gráfica lesse o que recebeu e mostrasse no jLabel. Vou colocar os códigos aqui e me desculpem pela minha ignorância se for uma coisa muito ridícula e eu não consegui pensar nisso.

Classe ServerAPI

package Server;

/**
 *
 * @author Cotts
 */
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ServerAPI {
    ServerSocket server;
    Socket socket;
    int port;
    BufferedReader in;
    
    
    public void ServerConect(){
        try {
            server = new ServerSocket(2000);
            while(true){
                server.accept();
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                in.readLine(); //queria jocar esta informação no label de outra classe.
                socket.close(); 
            }            
        } 
        catch (IOException ex) {
            System.out.println(ex);
        }
    }
  }

Classe ServerGUI

package Server;

import java.io.BufferedReader;
import java.io.IOException;


public class ServerGUI extends javax.swing.JFrame {
         
   
    public ServerGUI() {
        initComponents();
        
         
    }
   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Status:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(50, 50, 50)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(207, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(63, 63, 63)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(223, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

   
    public static void main(String args[]) throws IOException {
        
     
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

       
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
            
                new ServerGUI().setVisible(true);
            }
            
        });
        
        ServerAPI conect = new ServerAPI();
        conect.ServerConect();
        jLabel2.setText(String.valueOf(conect.in)); // queria jogar nesse jLabel
    }
   
    private javax.swing.JLabel jLabel1;
    public static javax.swing.JLabel jLabel2;
  }

Desculpem pelo excesso de código, pois estou utilizando o Netbeans e ele cira muito texto para a parte gráfica.

Agradeço desde já a ajuda.

4 Respostas

lucas_guj

Se quiser chamar um método em uma aplicação servidor por uma aplicação local vai ter que usar RMI

cotts

Não teria como fazer utilizando um actionlistener ou um get e set???

lucas_guj

Não teria como fazer utilizando um actionlistener ou um get e set???

Pelo o que eu entendi voce tem um servidor e tem uma GUI e voce quer rodar o servidor a partir da GUI. Se seu servidor estiver em um servidor mesmo eu só conheço a possibilidade disso usando RMI, agora se seu servidor vai estar na mesma máquina que a GUI ai voce pode fazer usando actionListener. Eu rodo meu servidor por linha de comando mesmo.

al.barbosa

lucas,

Pelo que entendi o cotts está tentando criar o servidor na máquina local mesmo. Ele disse que já conseguiu criar o servidor, só não consegue fazer o texto recebido aparecer numa janela (JFrame).

cotts,

Acho que tem duas questões que você precisa cuidar para você fazer o texto aparecer numa janela (JFrame):

Primeiro: quando você chama o método ServerConect() do servidor, ele entra no loop while(true) e não executa o jLabel2.setText(). Você precisa deixar o loop executando e ao mesmo tempo executar outros códigos. Como executar vários códigos no Java ao mesmo tempo? Você precisa usar threads.
Por isso, na solução que estou colocando abaixo, o ServerAPI implementa a interface Runnable. No método ServerConect, ele inicia uma thread. No método run() ele tem o loop while(true), que fica esperando o recebimento de uma String.

Segundo: você poderia passar o JLabel como parâmetro para a classe ServerAPI. O ServerAPI poderia mudar o valor do JLabel quando recebesse a String. Mas isso traria um problema de acoplamento: o ServerAPI estaria acoplado à janela (JFrame). Se você quisesse usá-lo sem a janela, teria que alterar o seu código.
Uma solução para o segundo problema é usar o padrão de projetos Observer. Na solução que estou enviando, o ServerAPI estende a classe Observable, e o ServerGUI implementa a interface Observer (a classe Observable e a interface Observer fazem parte da API Java SE). Ou seja, o serverGUI observa o ServerAPI. Quando o ServerAPI recebe a String, ele notifica os seus observadores. O ServerGUI, que é um dos observadores, quando notificado, altera a JLabel com o valor da String recebida.
Na classe ServerAPI eu coloquei um método getStringRecebida() para passar o texto recebido.

Abaixo um link para o livro de padrões de projetos (gangue dos quatro). O padrão Observer está na página 274:
[url]http://books.google.com.br/books?id=V0Ey1KF3zwcC&printsec=frontcover&dq=design+patterns+gamma+observer+padr%E3o+de+projeto&source=bl&ots=jR0huVja05&sig=UIEyKmIO0mQ2FjEEkFgZSFYzj2w&hl=pt-BR&sa=X&ei=r5UNUK6DMqTX0QH_4-H1Aw&ved=0CDYQ6AEwAQ#v=onepage&q&f=false
[/url]

Abaixo o código de exemplo:

classe ServerAPI (falta acertar o nome do pacote):

import java.net.*;  
import java.io.*;  
import java.util.*;  
  
public class ServerAPI extends Observable implements Runnable {  
    ServerSocket server;  
    Socket socket;  
    int port;  
    BufferedReader in;  

    private String stringRecebida;

    public String getStringRecebida(){
       return stringRecebida;
    }
      
    public void ServerConect(){  
        try {  
            server = new ServerSocket(2000);  
            Thread t = new Thread(this);
            t.start();
        }   
        catch (IOException ex) {  
            System.out.println(ex);  
        }  
    }  

    @Override
    public void run(){
        try {  
            while(true){  
                socket = server.accept();  
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
                stringRecebida = in.readLine(); //queria jocar esta informação no label de outra classe.  

                setChanged();
                notifyObservers();

                socket.close();   
            }              
        }   
        catch (IOException ex) {  
            System.out.println(ex);  
        }  
     }
  }

Classe ServerGUI (falta acertar o nome do pacote):

import java.io.BufferedReader;  
import java.io.IOException;  
import java.util.*;
  
public class ServerGUI extends javax.swing.JFrame implements Observer {  

    private ServerAPI conect;
    private javax.swing.JLabel jLabel1;  
    private javax.swing.JLabel jLabel2;  
     
    public ServerGUI() {  
        initComponents();  
          
        conect = new ServerAPI();  
        conect.ServerConect();

        conect.addObserver(this);
        update(conect, null);            
    }  

    @Override
    public void update(Observable o, Object o1) {
        ServerAPI api = (ServerAPI) o;
        String texto = api.getStringRecebida();
        if(texto != null) jLabel2.setText(texto); 
    }
     
    @SuppressWarnings("unchecked")  
    // <editor-fold defaultstate="collapsed" desc="Generated Code">  
    private void initComponents() {  
  
        jLabel1 = new javax.swing.JLabel();  
        jLabel2 = new javax.swing.JLabel();  
  
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
  
        jLabel1.setText("Status:");  
  
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());  
        getContentPane().setLayout(layout);  
        layout.setHorizontalGroup(  
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
            .addGroup(layout.createSequentialGroup()  
                .addGap(50, 50, 50)  
                .addComponent(jLabel1)  
                .addGap(18, 18, 18)  
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)  
                .addContainerGap(207, Short.MAX_VALUE))  
        );  
        layout.setVerticalGroup(  
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)  
            .addGroup(layout.createSequentialGroup()  
                .addGap(63, 63, 63)  
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)  
                    .addComponent(jLabel1)  
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))  
                .addContainerGap(223, Short.MAX_VALUE))  
        );  
  
        pack();  
    }// </editor-fold>  
  
     
    public static void main(String args[]) throws IOException {  
          
       
        try {  
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {  
                if ("Nimbus".equals(info.getName())) {  
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());  
                    break;  
                }  
            }  
        } catch (ClassNotFoundException ex) {  
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
        } catch (InstantiationException ex) {  
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
        } catch (IllegalAccessException ex) {  
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {  
            java.util.logging.Logger.getLogger(ServerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);  
        }  
        //</editor-fold>  
  
         
        java.awt.EventQueue.invokeLater(new Runnable() {  
  
            public void run() {  
              
                new ServerGUI().setVisible(true);  
            }  
              
        });  
        
    }  
     
  }
Criado 22 de julho de 2012
Ultima resposta 23 de jul. de 2012
Respostas 4
Participantes 3