Conectar aplicação swing com Banco MySql

32 respostas
Z

Boa noite colegas !

Alguém aqui já me disse que a melhor coisa a fazer em aplicações cliente X servidor é não faze-las !

Mas como não me convenci com essa afirmação… estou trabalhando em uma.

Basicamente tenho uma camada de apresentação desenvolvida com Swing e preciso conectar com um BD MySql instalado em um servidor, via internet.

Por enquanto estou utilizando um utilitário chamado putty, e consigo criar uma conexão com a maquina do servidor e me conectar com o banco usando “localhost”… mas não queria deixar assim.

Então se alguém puder me ajudar, fico muito agradecido !

Abraços a todos.

32 Respostas

A

Deixa eu ver se eu entendi

vc tem a camada view e quer que ela se conectar com banco de dados remoto?

na sua string de conexao coloca o ip do servidor ao invez de localhost
so que porta 3306 do mySql tem estar liberada la no servidor!!!

era isso?

abraço

I

Um outro detalhe vc tem que garantir que seu mysql aceite conexões de ips alem do localhost o mysql por padrão ão permite que usuários se conectem de outros ips

Z

Boa tarde colegas !

Boa noite colegas !

andredeividi:

Mudei a string para esta abaixo mas não funcionou…

conn = DriverManager.getConnection("jdbc:mysql://111.111.11.11/BANCO",   
                                "user","password");     
                conn = DriverManager.getConnection("jdbc:mysql://111.111.11.11:3306/BANCO",
                                                "user","password");

Também tentei colocar a porta 3306, mas também não funcionou.

conn = DriverManager.getConnection("jdbc:mysql://111.111.11.11:3306/BANCO",   
                                "user","password");     
                conn = DriverManager.getConnection("jdbc:mysql://111.111.11.11:3306/BANCO",
                                                "user","password");

A minha dúvida é porque eu consigo conectar via utilitário putty não significa que a porta 3306 esta liberada ?
Desculpe mas não entendo nada de rede…

Obrigado pela força.

[]s

I

Vc pode ter a porta liberada mas o seu usuário do banco deve estar limitado apenas a conexões locais
Qual a mensagem de erro que vc recebe quando executa o seu código para conectar ao banco?

Z

italo.vendrameto :

Na aplicação utilizei essa string:

conn = DriverManager.getConnection("jdbc:mysql://111.11.111.111/BANCO",
                                                "user","password");

E o erro que deu foi esse:

java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)

Tentei conectar via linha de comando do MySql utilizando a string:

mysql -u root -p -h 111.11.111.111 BANCO

E recebi esse erro:

ERROR 2003 (HY000): Can't connect to MySQL server on '111.11.111.111' (10061)

Se alguém puder ajudar fico muito agradecido.

[]s

Z

italo.vendrameto :

Na aplicação utilizei essa string:

conn = DriverManager.getConnection("jdbc:mysql://111.11.111.111/BANCO",
                                                "user","password");

E o erro que deu foi esse:

java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)

Tentei conectar via linha de comando do MySql utilizando a string:

mysql -u root -p -h 111.11.111.111 BANCO

E recebi esse erro:

ERROR 2003 (HY000): Can't connect to MySQL server on '111.11.111.111' (10061)

Se alguém puder ajudar fico muito agradecido.

[]s

Z

Boa tarde colegas !

italo.vendrameto

Eu tentei fazer a conexão via aplicação utilizando esse código:

conn = DriverManager.getConnection("jdbc:mysql://111.11.111.111/BANCO",
                                                "USER","PASSWORD");

Mas recebi esse erro:

java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)

Também tentei via linha de comando do MySql com esse comando:

mysql -u USER -p -h 111.11.111.111 BANCO

Mas recebi esse erro:

ERROR 2003 (HY000): Can't connect to MySQL server on '111.11.111.111' (10061)

Se alguém puder me ajudar fico muito agradecido.

[]s

A

Se vc ta usando o windows da uma olhada no firewall do cara!!!
isso la no servidor!!!

abraço

Z

Boa tarde colegas !

andredeividi:

O servidor é linux e o cliente aqui é windows…

Mas se a porta estivesse bloqueada no firewall eu conseguiria conectar via putty ?
Alguém sabe como esse utilitário funciona ?

[]s

A

pode cre!!! na verdade eu so queria entender a sua estrura!!!
O usuario que vc acessa no puty é o mesmo do da string de conexão?

manda a sua classe de conexão para nos ver como ela foi implementada.
qual versão do seu mySql?

Abraço

Z

Boa tarde colegas !

Se eu entendi no putty, eu crio uma conexão com o servidor.
Para isso tenho um usuário e senha.
Para fazer isso eu entro no putty, coloco o IP do servidor.
Depois vou em Connection >> SSH >> Tunnels e preencho Source port como 3306 e Destination como localhost:3306.

Clicando em open ele abre a conexão e pede meu usuario e senha do servidor (que não é o usuario do banco).

Segue minha classe de conexão:

/*
 * ConnectionFactory.java
 *
 * Created on 28 de Maio de 2007, 17:33
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.atm.DAO;

import atm.*;
import java.sql.*;
import javax.swing.JOptionPane;

public class ConnectionFactory {        
    private static ConnectionFactory instanciaUnica = null;
    private Connection conn = null;    
    private static int clientes = 0;
    
    private ConnectionFactory(){
        try {
                Class.forName("com.mysql.jdbc.Driver");
                System.out.println("Conectando ao banco MySql...");
                conn = DriverManager.getConnection("jdbc:mysql://localhost/Banco",
                                                "user","password");   
                        
                conn.setAutoCommit(false);
                System.out.println("Conectado ao banco MySql...");
                                       

        } catch (ClassNotFoundException e){
                JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                e.printStackTrace();
        } catch (SQLException e ) {
                JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                e.printStackTrace();
        }
    } 
    
    public static ConnectionFactory getInstance(){
        if (instanciaUnica == null) {
            instanciaUnica = new ConnectionFactory();                 
        } 
        return instanciaUnica;
    }
    
    public Connection getConnection(){
        if (conn == null){
            throw new RuntimeException("Conexão nula");
        }
        clientes++;
        System.out.println("Conexão " + clientes);
        return conn;        
    }
    
    public void shutDown(){
        System.out.println("Shutdown " + clientes);
        clientes--;
        
        try {
            conn.close();
            instanciaUnica = null;
            System.out.println("Conexão fechada");
            conn = null;
        } catch (SQLException sqle) {
            System.out.println(sqle);
        }
    }
}

Teste com um banco numa maquina na mesma rede que a minha e funcionou, para isso troquei o “localhost” para “10.11.52.154”, quer seria o IP dessa máquina.

Tentei trocar localhost pelo IP do servidor que não esta aqui na mesma rede mas não funcionou.

A versão do MySql do servidor é a MySql Server 5.0.32-Debian_7etch1-log

Obrigado a todos.

Um abraço.

F

Bom dia Zeed01,

seguinte cara… ainda lembro de algo do linux…
seu linux ta barrando a porta 3306, qual Linux vc ta usando !?

depois de conectar por SSH beleza… mas o problema é conseguir acessar a maquina sem isso certo, vc só quer acessar o banco…

o linux nao abre portas assim… ele é muito seguro! vc vai ter q configurar um scriptzinho pra abrir a porta 3306, assim como qualquer outra q queira
procure sobre iptables…

abraço,
espero q ajude :smiley: :smiley: :smiley:

Z

Boa noite colegas !

Um amigo me disse que não é uma boa idéia conectar diretamente na porta do mysql via internet por problemas de segurança.
Confesso que, como essa não é minha praia, fiquei sem saber porque.

Ele disse que o putty abre um túnel SSH seguro e que a conexão mysql trafega dentro desse túnel com total segurança…

Alguém consegue explicar isso melhor ?
Ou alguém discorda disso e porque ?

Um abraço.

I

E povo, bom o seu senário está meio confuso vamos detalha-lo um pouco mais dai nós podemos ver com mais clareza os possiveis problemas de segurança.

1º passo (qual o senário atual)

vc desenvolve da sua casa, rodando a p0liacação na sua máquina e precisa acessar o mysql em uma máquina remota que roda mysql em máquina linux

2º passo (senário final da sua aplicação depois de pronta)

concitnua rodando como no senário um ou a pliacação irá roda no mesmo servidor do Banco, ou em outros servidor mas no mesmo local onde fica o servidor do banco

pensa nisso que dai posso responder melhor suas dúvidas

Z

Bom dia colegas !

italo.vendrameto:

Os cenários atuais e após o desenvolvimentos são idênticos: a aplicação (entendo como meu .jar) vai estar na máquina do cliente e tem que acessar um banco de dados MySql que fica em outro servidor, em outra rede, na maioria dos casos em outra cidade.

Você sabe se realmente existe problema de segurança em liberar a porta 3306 no servidor e conectar diretamente sem utilizar um tunel SSH, como o que é criado pelo putty ?

Ou, é possível criar esse túnel através da aplicação ? Para que isso fique transparente paro o usuário.

Obrigado pela ajuda, e desculpe pela explicação confusa… eu sou horrível nisso.

[]s

F

Olá bom dia!

o túnel SSH não irá nos ajudar nesse caso.
então, acho q o mais seguro é não mexer com internet (ainda)

faça seu projeto dentro do seu servidor q busque as informações direitinho no banco e mostre dados por html ( daí da pra ver pela web… aí sim)

se vc precisa de um cliente q busque no servidor… tente pegar esses dados em outra porta: ( a 80, por exemplo q é aberta a requisições) daí vc precisa de um programinha servidor q vai tratar esses dados pra vc e mandar não sei como para o seu programa cliente --> ta ficando mais punk, né !!! :shock: :shock:

mas como sou iniciante, nunca fiz uma loucura dessas (ainda), fico só de intranet mesmo :wink:

qualquer coisa, posta ae!

Z

Bom dia colegas !

felipe_thrash:

Obrigado pela força !

O problema é que a minha aplicação é Swing.
Então não tenho como utilizar html.

[]s

I

Realmente deixar a porta do mysql aberta não é interessante, qualuqer adm de redes vai falar para procurar outra alternativa mas tb não é o fim do mundo. o puty como vc tem dito no decorer do post abre uma conexão segura da sua máquina ate o servidor mas ele não vai resolver o seu problema pq vc fica na máquina servidor então sua apliação deveria estar lá.

O correto seria montar uma VPN entre local do cliente e o local do servidor dessa forma tudo irá trafegar por um canal cripografado e virtualmente em uma rede só.

Quanto a transparencia disso para usuário se não me engano muitos modens ADSL fazem tuneis, isso facilita o lado do seu cliente, do lado do server vc tem que se acertar com o ADM dele

F

então, a dica ( a primeira ehhe) continua:

configure um script pra abrir a sua 3306! :stuck_out_tongue: :stuck_out_tongue:

mas aí vc vai precisar da ajuda do adm de rede aí…

não é facil, mas com técnica, o servidor não irá ficar vulnerável, uma vez q o banco de dados esteja preparado e criptografado…

aí vc pode fazer seu projeto swing na manha…
mas pra configurar um iptable bonitinho tem q suar a camisa, vc e o adm aí do teu trampo !

posta ae o q vc axa!!!

falows :wink:

Z

Boa tarde colegas !

italo.vendrameto e felipe_thrash:

“o puty como vc tem dito no decorer do post abre uma conexão segura da sua máquina ate o servidor mas ele não vai resolver o seu problema pq vc fica na máquina servidor então sua apliação deveria estar lá.”

Italo, não entendi essa parte… hoje já estou testando assim, abro uma conexão através do putty entre a minha maquina cliente (que esta em outra rede) e o servidor onde esta o MySql. Dai pra frente minha aplicação funciona aqui na máquina cliente normalmente, sem nenhum trauma… então, mesmo eu não querendo adotar essa alternativa, porque obrigaria o usuario a abrir a conexão manualmente pelo putty, eu não entendi porque você disse que não funcionaria.

Diante da sua confirmação que deixar a porta 3306 aberta realmente não é uma boa idéia por causa da segurança, existe uma maneira de criar o tunel SSH via aplicação Java ?

A idéia da VPN foi o que também propôs o administrador do meu servidor.

Mas o que queria era achar um jeito para que isso fosse transparente para o usuário, ou seja, ele clica no icone da aplicação e de alguma forma, mesmo que através de um .bat eu crio a conexão segura.

[]s

I

Quanto ao putty eu devo estar confundindo so programas mas, quanto a sua pergunta vc pode deria fazer o seguinte deixar o seu servidor configurado para trabalhar como VPN dai vc só estabece o tunel da VPN quando o usuário iniciar sua aplicação atraves de um Bat que conecta e valida a conexão.

Nunca fiz dessa forma mas acho que funciona

F

insistindo novamente ( tu já quer me dar um tiro :P)

conversou com teu mano adm aí sobre iptables !?

se ele falou q é arriscado é pq ele não sabe mexer com isso kkkk o servidor não irá ficar exposto não… e se o projeto requer muitos usuarios acessando o banco, criar uma vpn pra cada um ia ser um código violento!

e outra: tunnel VPN tem q ser alien pra fazer uma parada dessas :twisted:

Z

Boa tarde colegas !

felipe_thrash:

Cara… isso é o que acontece quando não dominamos um assunto: ficamos reféns de quem diz que sabe !
É o que esta acontecendo comigo… se o administrador diz que não é seguro, eu não tenho argumento para dizer que é.
Você consegue me explicar melhor como funcionaria com iptables ?

Bom… vou tentar conversar com o cara de novo.

Valeu !

[]s

F

Zeed01:
Boa noite colegas !

Alguém aqui já me disse que a melhor coisa a fazer em aplicações cliente X servidor é não faze-las !

Mas como não me convenci com essa afirmação… estou trabalhando em uma.

Basicamente tenho uma camada de apresentação desenvolvida com Swing e preciso conectar com um BD MySql instalado em um servidor, via internet.

Abraços a todos.

O fato de a sua aplicação estar separada fisicamente do Banco de Dados nao a transforma numa aplicação cliente-servidora
Você esta acessando o banco de dados diretamente. Nao existe nenhuma aplicação servidora te fornecendo serviços.

F

trabalhei com um adm de redes q a vida dele era o shell :shock:

vai ver o kra que tá aí não conhece iptables… daí complica… pq essa parte não é com a gente, é pra louco do linux ( hehehe) pq a gente só pede pra liberar a porta… e os caras fazem o resto…

o tal do iptable é um script… (vide google exemplos) que vc joga la no .conf do servidor pra ele liberar a porta, e disso e configura até quantos e quais ip’s irão acessar aquela porta…

to tentando fazer contato com o cara q trabalhei… mas nada… :frowning:
ele tinha um que abria prontamente a porta do mySQL… com segurança e tudo mais… tudo determinado!

agora se seu adm não conhece… é dificil, pq não é só um tutorialzinho na net q o cara vai aprender… mas acredito que valha mais a pena ele ralar pra aprender isso… do que vc’s 2 ralarem o triplo pra VPN… :shock:

(minha opinião)
tire suas conclusoes… e poste! heheh

Z

Boa tarde colegas !

fabiocsi:

Não entendi o que você quis dizer…

Veja bem eu tenho uma aplicação que fica em uma máquina e acessa um servidor de banco de dados em outra máquina.

O que você quis dizer com: “Nao existe nenhuma aplicação servidora te fornecendo serviços” ?

O que seria, então, para você uma aplicação client x server ? Tem algum exemplo prático ?

Veja bem… não estou dizendo que o que você falou é errado, estou questionando porque eu não sei mesmo.

Abraços !

P.S. - O melhor do Guj é isso… comecei querendo saber como conectar minha aplicação com um banco de dados MySql e ganhei uma explicação de aplicação client x server de brinde !

:smiley:

P

Galera aki está o link do meu curriculum por favor me ajuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuudemmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

http://www.curriculum.com.br/ucn/pedrotaek

Não suporto mais ter que esperar uma oportunidade na área, mas que DROGA quero trabalhar com java!!!

Obrigado pela atenção

F

o cara ae de cima ta desesperado!!!

ou taekpedro, não é só tu não q ta na corrida !!!

:? :?

F

Zeed01:
Boa tarde colegas !

fabiocsi:

Não entendi o que você quis dizer…

Veja bem eu tenho uma aplicação que fica em uma máquina e acessa um servidor de banco de dados em outra máquina.

O que você quis dizer com: “Nao existe nenhuma aplicação servidora te fornecendo serviços” ?

O que seria, então, para você uma aplicação client x server ? Tem algum exemplo prático ?

Veja bem… não estou dizendo que o que você falou é errado, estou questionando porque eu não sei mesmo.

Abraços !

P.S. - O melhor do Guj é isso… comecei querendo saber como conectar minha aplicação com um banco de dados MySql e ganhei uma explicação de aplicação client x server de brinde !

:D

Bom, se a aplicação que vc esta dizendo, é a aplicação SERVIDORA e os seus clientes irão fazer solicitações à esta aplicação, entao eu me confundi…

Estou dizendo o seguinte: nao é pelo fato de estar em meio fisico diferente, que é cliente-servidor ( como eu ja vi pessoas fazerem… instala um software na maquina do cliente, e esse software instalado no cliente acessa um banco de dados remoto, em um lugar fisico diferente ). Se seus clientes acessam o banco de dados DIRETAMENTE, sem passar por uma aplicação servidora, não é client-server e de cara tem a maior falha de segurança possivel.

Veja o desenho abaixo: se seu caso for o de baixo, entao vc corre serios riscos de segurança:


F

Errei o desenho acima: substitua o SERVIDOR por APLICAÇÃO JAVA SERVIDORA.

Z

Boa noite colegas !

fabiocsi:

Lá vou eu de novo…
Pelo jeito estou muito mal em arquitetura de sistemas.

Quando você diz que no primeiro caso as aplicações acessam um servidor e esse servidor acessa o banco, significa que o banco estaria, fisicamente, em uma outra máquina ?
Nesse caso, na pratica o que acontece é que minha aplicação final, aquela acessada pelos usuários, nem saberia onde e como chegar ao banco de dados, daí a melhora na segurança… é isso ?

E no segundo caso as aplicações acessariam diretamente a maquina onde esta o banco, conectando-se através de jdbc, por exemplo ?

Obrigado pela paciência.

[]s

F

"Quando você diz que no primeiro caso as aplicações acessam um servidor e esse servidor acessa o banco, significa que o banco estaria, fisicamente, em uma outra máquina ? "

O “Servidor” é uma aplicação (Java ou nao) de retaguarda que vc tem que serve as aplicações clientes. As aplicações que estao no cliente, solicitam serviços ( uma consulta, por exemplo ) e essa aplicação servidora se encarrega de ir no banco, buscar os dados e devolver pro cliente.

A aplicação que esta no cliente nao pode acessar o banco de dados diretamente. Veja o cenario J2EE: os browsers nos clientes solicitam informações à uma aplicação WEB… ela, se necessario, conecta no banco ( que pode estar na mesma maquina do servidor de aplicação ou nao ) e cospe HTML de volta. Suas aplicações clientes nem imaginam onde esta o banco de dados.

No caso 2, onde as aplicaçõs conectam direto no banco (via jdbc por exemplo), vc nao tem segurança. O banco pode estar na mesma maquina da sua aplicação cliente ou no Japao, mas será que metendo um sniffer na tua rede eu não consigo usuario e senha do banco, endereco do banco, e talz… ?

Criado 10 de setembro de 2007
Ultima resposta 14 de set. de 2007
Respostas 32
Participantes 6