Uma classe atrapalha a outra?

23 respostas
ericmaicon

Olá galera..tudo bem?

eu não sabia como procurar isso aqui e resolvi criar o tópico!!

eu fiz uma classe pra ler arquivo .txt ou .conf!!
até ai blz..ele tá lendo mil maravilhas um arquivo .conf e ainda fiz umas brincadeirinhas nele:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servidormn;

//Chamando todas as libs a serem usadas
import java.io.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Eric
 */
public class OpenFile {

    //Declarando todas as variáveis usadas.
    private     String                          dirProj         =       System.getProperty("user.dir");
    private     String                          linha           =       null;
    private     FileReader                      reader          =       null;
    private     BufferedReader                  leitor          =       null;
    private     static          OpenFile        internalOpen    =       null;
    private     String                          pedido          =       null;

    //Criando a Classe
    public OpenFile() {

        //O Try serve para tentar fazer a ação
        try {
            //Abrindo o arquivo do diretório do projeto
            reader = new FileReader(new File(dirProj + "/server.conf"));

            //fazendo o buffer
            leitor = new BufferedReader(reader,1*1024*1024);

        } catch(FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Arquivo não encontrado: " + e);
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Problema com o Arquivo: " + e);
        }
    }

    //Essa classe serve para não declarar toda hora o OpenFile
    private static OpenFile getOpenInterno() {
        if(internalOpen == null) 
            internalOpen = new OpenFile();
        return internalOpen;
    }

    //Fazer a leitura do Arquivo e Retornar a variável desejada!
    private String LerArquivoInterno(String VarPedida) {

        //Tratando o While
        try {
        
            //Tratando e mostrando os valores do BUF!
            while((linha = leitor.readLine()) != null) {

                //Pegando a variável pedida
                if(linha.trim().startsWith("$"+VarPedida)) {
                    String[] linhas = linha.split(" = ");
                
                    pedido = linhas[1];
                }

            }

            return pedido;
            
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Problema com a leitura do arquivo: " + e);
            return null;
        }
    }

    //Chamando a leitura
    public static String LerArquivo(String VarPedida) {
        return getOpenInterno().LerArquivoInterno(VarPedida);
    }

    //Fazendo o Close de todas as Var Usadas
    @Override
    protected void finalize() throws Throwable {
        try {
            leitor.close();
            reader.close();
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Problema ao fechar os Arquivos: " + e);
        }
        super.finalize();
    }
}

ai fui resolver fazer uma classe de sockets...no qual ele busca a porta num arquivo .conf (pela classe acima)!!

tava dando trabalho, eu pensando q o erro era na classe eu fui e deletei e criei um simples mesmo quando clica no botão conecta...

ai eu percebi q se eu fizer assim:
//Iniciando o Serviço
    String portaSTR;
    Integer portaINT;

    //Usando a Classe OpenFile para utilizar a porta
    portaSTR = OpenFile.LerArquivo("Porta");

    //Convertendo o Valor para int
    portaINT = Integer.parseInt(portaSTR);

    ServerSocket serverSocket = null;

    try {
        serverSocket = new ServerSocket(portaINT);
        area_texto.append("Conexão do Servidor aceita na porta 4444");
    } catch (IOException e) {
        System.out.println("Could not listen on port: 4444");
    }

ele não manda a msg pro textarea(area_texto)...se eu fizer assim:

//Iniciando o Serviço
    ServerSocket serverSocket = null;

    try {
        serverSocket = new ServerSocket(4444);
        area_texto.append("Conexão do Servidor aceita na porta 4444");
    } catch (IOException e) {
        System.out.println("Could not listen on port: 4444");
    }

ele manda e abre o socket!!

o q pode ser??

Obrigado Galera!!

23 Respostas

thegoergen

Pergunta besta agora, mas lá vai: No seu arquivo você diz que quer a porta 4444?

ericmaicon

no meu arquivo tava a 7000…pois pra mim q o socket poderia usar qualquer uma sabe?

mas eu acabei de mudar para a 4444 e tb não deu nada!!

edit:
fuçando aqui descobri que o erro tava nos espaços aqui oh:

String[] linhas = linha.split("=");

antes tava com espaço antes e depois do =!!

mas mesmo assim se eu der:

JOptionPane.showMessageDialog(null, portaSTR);

ele mostra 4444

se eu der:

JOptionPane.showMessageDialog(null, portaINT);

ele não mostra nada…nem a janela do JOptionPane ele chama!!

edit 2:

haeuhaehuaehuea…engraçado q a gente vai apanhando e aprendendo!!
:smiley:

o erro tava no .conf!!

eu coloquei assim:

$Porta = 4444

e ele não lê por causa dos espaços1!!

ericmaicon

Posso aproveitar o tópico pra tirar outra dúvida???

eu tentei fazer uma thread na minha conexão de sockets..mas deu erro!!
hahaha

estou começando a avançar..ai não sei muito ainda!!

minha classe de socket ficou assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servidormn;

//Chamando as Libs
import java.io.*;
import javax.swing.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author Eric
 */
public class Sockets extends Thread {
    
    //Declarando as Variáveis
    private         String          portaSTR        =       OpenFile.LerArquivo("Porta");
    private         int             portaINT        =       Integer.parseInt(portaSTR);
    private         ServerSocket    socket          =       null;
    private         Socket          clientSocket    =       null;

    private static  Sockets          internalSocket  =       null;

    //Declarando a Classe
    public Sockets() {
        try {
            socket = new ServerSocket(portaINT);        
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Erro de Conexão na porta: " + portaINT + ", erro: " + e);
        }
    }

    //Classe para não precisar chamar o Socket() toda hora
    private static Sockets GetSocketInterno() {
        if(internalSocket == null)
            internalSocket = new Sockets();
        return internalSocket;
    }

    //Classe para o Retorno da Conexão
    private String GetConnectionInterno() {
        return "\nConexão do Servidor aceita na porta " + portaINT;
    }

    //Retornando a classe GetConnectionInterno
    public static String GetConnection() {
        return GetSocketInterno().GetConnectionInterno();
    }

    //Classe para a espera do cliente
    private String GetClienteInterno() {
        try {
            clientSocket = socket.accept();
            return "\nCliente Conectado: " + clientSocket.getInetAddress().getHostAddress();
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Falha de Aceitação na Porta: " + portaINT + ", erro: " + e);
            return null;
        }
    }

    //Retornando a classe GetClienteInterno
    public static String GetCliente() {
        return GetSocketInterno().GetClienteInterno();
    }
}

na hora de chamar eu fiz isso:

Sockets skt = new Sockets();
skt.start();

    //Iniciando o Serviço
    area_texto.append(skt.GetConnection());

    //Chamando os Clientes:
    area_texto.append(skt.GetCliente());

ele dá um erro:

[img]http://img388.imageshack.us/img388/6625/imagemjf2.jpg[/img]

doug

Olá
Parece que outra coisa esta ocupando essa porta… “address already in use”.
Verifica certinho se não tem outra aplicação usando ou vc esta chamando duas vezes…

Espero ter ajudado
Flwss

ericmaicon

eu pensei nisso e mudei a porta de 4444 para 4445 antes de postar!!

mas me resultou a mesma coisa!!

XpLoDeR

Olá ericmaicon,

Na maioria das vezes esses erros de bind acontecem por que o S.O. leva um tempinho para liberar a porta.

Este erro acontece depois que você encerra a aplicação e a inicia novamente?

ericmaicon

então…de qualquer jeito!!
eu tentei mudar a porta do zero 2x pra ver se era isso…

coloquei 65005 sem nem ter aberto antes e deu esse erro!!

eu pensei q era problema do meu thread por ser a primeria vez q eu tou trabalhando com isso…sendo q eu segui um tuto do devmedia!!

mas não é pelo jeito né?

wandersonxs

Ja verificou se a porta esta liberada no firewall?
Não parece este erro, mas vai saber… rs’

Abraços
Wanderson :twisted:

ericmaicon

meu firewall está parado…não estou usando!!
:frowning:

T

Não use finalizers; eles não são confiáveis, e deixam sua aplicação mais lenta. Em vez disso, feche tudo que você usar imediatamente após o uso.

Marky.Vasconcelos

E só para constar… use as convenções de código para programar…

é bem mais fáçil de entender quando todos escrevem igual.

O unico problema que vi foi no seus metodos
GetClienteInterno
LerArquivo
Etc…
começe nome de metodos com letras minusculas

getClienteInterno
lerArquivo
etc…

ericmaicon

opa thingol…valeu…vou fazer uma parte para fechar sem o finalizes

Mark_Ameba, teria um link que fale sobre isso? eu não sabia disso…hehehe…

e sobre o erro? alguém tem uma sujestão??

Marky.Vasconcelos

http://java.sun.com/docs/codeconv/

Depois de aprender voce vai ver analizando o código de outras pessoas que todo mundo faz asism para facilitar a leitura (Menos alguns casos que nem voce ^^).

ericmaicon

heheheh bixo…mas eh pq sou novato ainda…não sabia disso!!

:frowning:

mas alguém sabe do erro???

thiagofesta

Com certeza absoluta esta rodando dois sockets servers ao mesmo tempo e na mesma porta.

Por exemplo, abri um socket server na porta 1234, e depois tento abrir novamente, irá dar este erro.
Verifique isto!

Abraço!

thiagofesta

Mais um detalhe, se estiver rodando em maquina local, ou rede local não é necessário abrir portas.
Caso seja rede local, libere no firewall, mas é difícil de bloquear, e se estiver bloqueando não será esse erro que irá exibir, ele apenas não irá conectar.

ericmaicon

então…só se o próprio programa…a própria chamada o chama 2x…

e está sem firewall!! eu retirei o firewall para rodar em rede local!!

pode ser erro na classe?

thiagofesta

ericmaicon:
então…só se o próprio programa…a própria chamada o chama 2x…

e está sem firewall!! eu retirei o firewall para rodar em rede local!!

pode ser erro na classe?

Acredito que sim, não cheguei a ver ela, mas depois vou dar uma olhada.

ericmaicon
private String GetConnectionInterno() {
        try {
            socket = new ServerSocket(portaINT);        
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Erro de Conexão na porta: " + portaINT + ", erro: " + e);
        }

        return "\nConexão do Servidor aceita na porta " + portaINT;
    }
eu mudei para isso!!

e meu programa trava qd chama!!

M

Será que você realmente precisa abrir várias portas diferentes? Em um servidor HTTP, por exemplo, a porta padrão aberta é a 80. Quando um cliente se conecta a essa porta, é automaticamente transferido para outra porta, deixando a 80 livre para o próximo cliente.

Acho que deve ter apenas 1 ServerSocket aberto e quando você clicar no botão Parar, essa porta deve ser fechada (isso você ainda precisa fazer, criar um método fechaConexao, por exemplo). Quando à sua classe, procure, quando possível, implementar a interface Runnable, a estender Thread (e na verdade, a classe como está, nem precisava ser um Thread).

O erro deve acontecer pois a porta continua aberta, mesmo se a aplicação terminar, e quando você executa novamente, ele informa que a JVM já está utilizando a porta (não tenho certeza disso, se alguém souber um motivo diferente, me corrijam). Tente reiniciar sua IDE se isso acontecer.

thiagofesta

marcobiscaro2112:
Você tem razão, está é a idéia…

Melhorando:
ter um socket server, a onde você irá dar um new SocketServer, ai depois você faz um método, ou logo depois que irá aguardar conexões, quando achar uma conexão ai cria uma thread, ou seja cada cara conectado vai ser uma thread.
Seria algo assim:

ServerSocket serverSocket = new ServerSocket(1234); while(true) { serverSocket.accept(); new ServidorThread(socket).start(); }

Isto foi uma idéia!
Espero ter ajudado!

M

Pelo que pude ver, ericmaicon tem um JFrame para controlar o servidor. Para evitar que a mesma porta seja aberta várias vezes, você deve alterar o estado dos JButton, através da propriedade setEnabled(). Ou seja, se o servidor estiver ligado, o botão “Iniciar” deve ser setado como setEnabled(false) e o “Parar” como setEnabled(true). Se o servidor estiver parado, deve ser feito o contrário.

thiagofesta:
Melhorando:
ter um socket server, a onde você irá dar um new SocketServer, ai depois você faz um método, ou logo depois que irá aguardar conexões, quando achar uma conexão ai cria uma thread, ou seja cada cara conectado vai ser uma thread.

Exatamente! É essa a grande idéia, o que vai mudar será a condição do while, pois deve verificar se o servidor está ligado ou não (isso inclui os eventos dos botões).

fantomas
Minha hipótese sobre o seu problema é a seguinte:
Sockets skt = new Sockets();
skt.start();

//Iniciando o Serviço
area_texto.append(skt.GetConnection());

//Chamando os Clientes:
area_texto.append(skt.GetCliente());
Logo quando este trecho de código começa a ser processado é criado o socket (server) na porta 4444, logo depois é executado o método GetConnection(), que por sua vez, tenta abrir o socket (server) de novo (executa o getSocketInterno). Veja abaixo:
//Classe para não precisar chamar o Socket() toda hora
    private static Sockets GetSocketInterno() {
        if(internalSocket == null)
            internalSocket = new Sockets();
        return internalSocket;
    }

    //Retornando a classe GetConnectionInterno
    public static String GetConnection() {
        return GetSocketInterno().GetConnectionInterno();
    }

Como a variável internalSocket está nula o erro é ocorre (new Sockets() é executado novamente).

Talvez se você fizer assim a coisa melhore:

//Declarando a Classe
    public Sockets() {
        try {
            socket = new ServerSocket(portaINT);        
            internalSocket = socket // <---------------<< ALTEREI AQUI
        } catch(IOException e) {
            JOptionPane.showMessageDialog(null, "Erro de Conexão na porta: " + portaINT + ", erro: " + e);
        }
    }

P.S O código está um pouco confuso, e fora do padrão como já foi dito; sei q vc está aprendendo mas se vc não der um jeito nisso agora vc vai começar a achar sua bagunça organizada e vai ficar mais difícil de melhorar, ou seja, o quanto antes MELHOR. Geralmente o que dificulta a encontrar os problemas são justamente a falta de organização, padronização, legibilidade etc... deveriam ser as primeiras coisas a serem aprendidas. Mais uma coisa, threads são consideradas tópico avançado portando dê uma atenção especial a este assunto, estude/leia mais.

Bons estudos!

flws

Criado 3 de janeiro de 2009
Ultima resposta 8 de jan. de 2009
Respostas 23
Participantes 10