Socket na web via servlet não conecta minha máquina

6 respostas
palhadecoco

coloquei um socket em um host na web(servlet) para enviar um texto para meu serverSocket q fica em minha máquina aqui em casa, mas não envia mas dentro da máquina funciona.

o prblema é quando conecto de fora da minha rede q não funciona, ja desabilitei o firewall e nada

Meu ip é tipo 187.20.x.x mas dentro do pc funciona tudinho.

I NEED HELP.

gracias

6 Respostas

M

Difícil ajudar… há pouca informação. O servidor está diretamente conectado à Internet? Você também? Você consegue pingar para o servidor? E o contrário?

xjunior

Bom, na apostila da caelum tem um exemplo muito interessante disso, se não me engano na primeira.

aqui vai um exemplo implementado, dá uma olhada, pois ele funciona em rede local, na net nunca testei:

package testes;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 *
 * @author xjunior
 */
public class Cliente {
 private String host;
 private int porta;
 public Cliente (String host, int porta) {
    this.host = host;
    this.porta = porta;
 }

 public void executa() throws UnknownHostException, IOException {
    Socket cliente = new Socket(this.host, this.porta);
    System.out.println("O cliente se conectou ao servidor!");

 // thread para receber mensagens do servidor
    Recebedor r = new Recebedor(cliente.getInputStream());
    new Thread(r).start();

 // le msgs do teclado e manda pro servidor
    Scanner teclado = new Scanner(System.in);
    PrintStream saida = new PrintStream(cliente.getOutputStream());
     while (teclado.hasNextLine()) {
        saida.println(teclado.nextLine());
     }

     saida.close();
     teclado.close();
     cliente.close();
 }
 }

package testes;

import java.io.IOException;
import javax.swing.JOptionPane;

/**
 *
 * @author xjunior
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[]args) throws IOException{
        String Door;
        String IP;
        if(JOptionPane.showConfirmDialog(null, "Deseja Usar a conta Servidor?")==0){
            Door = JOptionPane.showInputDialog("Favor Inserir o numero da porta");
            Servidor Serv = new Servidor(Integer.parseInt(Door));
            Serv.executa();
        }else{
            Door = JOptionPane.showInputDialog("Favor Inserir o numero da porta do Servidor:");
            IP = JOptionPane.showInputDialog("Insira o endereço do servidor:");
            Cliente Cli = new Cliente(IP, Integer.parseInt(Door));
            Cli.executa();
        }
       
    }

}

package testes;

import java.io.InputStream;
import java.util.Scanner;

/**
 *
 * @author xjunior
 */
class Recebedor implements Runnable {

 private InputStream servidor;

 public Recebedor(InputStream servidor) {
    this.servidor = servidor;
 }

public void run() {
 // recebe msgs do servidor e imprime na tela
    Scanner s = new Scanner(this.servidor);
     while (s.hasNextLine()) {
         System.out.println(s.nextLine());
     }
 }
}

package testes;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author xjunior
 */
public class Servidor {
 private int porta;
 private boolean encerrar;
 private List<PrintStream> clientes;

 public Servidor (int porta) {
    this.porta = porta;
    this.clientes = new ArrayList<PrintStream>();
 }

 public void executa () throws IOException {
 ServerSocket servidor = new ServerSocket(this.porta);
 System.out.println("Porta "+this.porta+" aberta!");

 while (!encerrar) {
 // aceita um cliente
     Socket cliente = servidor.accept();
     System.out.println("Nova conexão com o cliente " +
     cliente.getInetAddress().getHostAddress()
 );

 // adiciona saida do cliente à lista
     PrintStream ps = new PrintStream(cliente.getOutputStream());
     this.clientes.add(ps);

 // cria tratador de cliente numa nova thread
     TrataCliente tc = new TrataCliente(cliente.getInputStream(), this);
     new Thread(tc).start();
    }

 }
 
 public void distribuiMensagem(String msg) {
 // envia msg para todo mundo
 for (PrintStream cliente : this.clientes) {
 cliente.println(msg);
 }
 }
}

package testes;

import java.io.InputStream;
import java.util.Scanner;

/**
 *
 * @author xjunior
 */
class TrataCliente implements Runnable{

 private InputStream cliente;
 private Servidor servidor;

 public TrataCliente(InputStream cliente, Servidor servidor) {
    this.cliente = cliente;
    this.servidor = servidor;
 }

public void run() {
    // quando chegar uma msg, distribui pra todos
        Scanner s = new Scanner(this.cliente);
         while (s.hasNextLine()) {
            servidor.distribuiMensagem(s.nextLine());
        }
         s.close();
    }
 }

Cara, implementei em java SE, num sei se vai ajudar, mas testa aí, e vê se vai funcionar fora da rede, pois nao tenho nem como testar agora, flw mano, espero ter ajudado!

palhadecoco

o meu socket ta na net ai ele conecta minha máquina e envia uma mensagem, só q da erro é como se não conectasse a porta q eu abrir pelo outro socketserver em minha máquina.

engraçado é q no servidor na net ele funciona como um server socket mas como cliente não da certo.

Se eu estiver fazendo tudo certinho então o problema ta no servidor online, estou usando o eatj.com gratuito por 30 dias

meu servlet cliente (trecho do código):

public class enviar_para_server extends HttpServlet {

String ip_envio = null;
String texto_chat = null;
Socket enviar_cliente=null;
  
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        ip_envio = request.getParameter("ip_envio");// pega ip via get
       
        try {
             ////------------ enviar ---
        try {

         enviar_cliente = new Socket( ip_envio, 12300);
         PrintStream enviar = new PrintStream(enviar_cliente.getOutputStream());
         enviar.println("mensagem para o server em minha maquina de casa");
         out.println(""+texto_chat);
         enviar_cliente.close();
         
        }catch (IOException ex) { out.println(0); enviar_cliente.close(); }

        ///------------------------
        } finally { 
            out.close();
        }
    } 

    

}

no meu pc tudo funciona certinho mas na net não

até mais

M

Para enviar para um ServerSocket, o seu trecho dá certo, ao menos na LAN. O servidor web de hospedagem pode estar protegido com um firewall, por exemplo, que impede que conexões para fora dele sejam realizados (imagine um código malicioso rodando nele…). É preciso ver isso com o fornecedor da hospedagem.

xjunior

Concordo com o nosso amigo aí em cima, olha com o seu fornecedor de hospedagem.

palhadecoco

valeu galera o importante é q tudo pode ta certo.

gracias

Criado 7 de janeiro de 2010
Ultima resposta 10 de jan. de 2010
Respostas 6
Participantes 3