[RESOLVIDO] Como conectar o Socket de uma rede local com uma rede externa

18 respostas
R

Bom dia! estou desenvolvendo um chat simples o problema é que funciona normal na rede local mas não funciona na internet, por exemplo o meu notebook esta roteado sendo assim o endereço dele é 192.168.0.xxx ,é onde está o ServerSocket na porta 5000 , se eu tentar rodar o cliente de outra rede sem ser local ele não conecta, pois o ip da internet é 200....,
como o cliente pode encontrar o servidor? :roll:

package projetos.msn;

import java.awt.EventQueue;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ClienteGUI extends JFrame {
	
	private JPanel contentPane;
	private JTextField textField;
	private Socket socket;
	private Scanner scn;
	private PrintWriter print;
	private JTextArea textArea;
    private String nome;
	private Login lg;
	private JTextArea txtrFff;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		
		
		/*EventQueue.invokeLater(new Runnable() {
			public void run() {
				
				try {
					ClienteGUI frame = new ClienteGUI(nome);
					frame.setVisible(true);
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});*/
	}

	public void configRede(){
		try{
		socket = new Socket(lg.ip,5000);
		
		print = new PrintWriter(socket.getOutputStream());
		scn = new Scanner(socket.getInputStream());
		new Thread(new EscutaServer()).start();
		
		}catch(Exception ex){
			//ex.printStackTrace();
			
			JanelaDeErro jE = new JanelaDeErro();
			
		}
	}
	
	private class EscutaServer implements Runnable{
		Scanner scanner;
		public EscutaServer(){
			try {
				scanner = new Scanner(socket.getInputStream());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		public void run() {
			try{
			String line;
			while((line = scanner.nextLine())!= null){
				
				
				textArea.append(line+"\n");
				
				textField.setText("");
				setVisible(false);
				setVisible(true);
			}
			scanner.close();
			
			}catch(Exception exc){
				System.out.println("erro escutaServer");
			}
		}
		
	}
	public ClienteGUI(String nome) {
		
		super("RW Mensageiro : "+nome);
		this.nome = nome;
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		setVisible(true);
				
		JButton btnEnviar = new JButton("Enviar");
		btnEnviar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					
					print.println(ClienteGUI.this.nome +" diz: "+textField.getText());
					print.flush();
					
				}catch(Exception ex){
					System.out.println("erro enviar");
				}
				
				
			}
		});
		
		textField = new JTextField();
		textField.setColumns(10);
		
		JScrollPane scrollPane = new JScrollPane();
		
		configRede();
		
		JScrollPane scrollPane_1 = new JScrollPane();
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPane.createSequentialGroup()
							.addComponent(textField, GroupLayout.PREFERRED_SIZE, 217, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addComponent(btnEnviar))
						.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
							.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, 190, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 94, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap())
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 330, GroupLayout.PREFERRED_SIZE)
						.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, 329, GroupLayout.PREFERRED_SIZE))
					.addGap(10)
					.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnEnviar)
						.addComponent(textField, GroupLayout.PREFERRED_SIZE, 29, GroupLayout.PREFERRED_SIZE))
					.addContainerGap())
		);
		
		 textArea = new JTextArea();
		textArea.setEditable(false);
		scrollPane_1.setViewportView(textArea);
		
		 txtrFff = new JTextArea();
		txtrFff.setEditable(false);
		scrollPane.setViewportView(txtrFff);
		contentPane.setLayout(gl_contentPane);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 332, 437);
		setResizable(false);
	}
}
package projetos.msn;

import javax.swing.*;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Servidor extends JFrame{
	
	List<PrintWriter> escritores = new ArrayList<PrintWriter>();
	public void sendAll(String texto){
		for(PrintWriter escreve : escritores){
			escreve.println(texto);
			escreve.flush();
			
		}
	}
	private Socket socket;
	private ServerSocket server;
	private Scanner scn;
	private PrintWriter print;
	public Servidor(){
		super("Server");
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(50,1);
		setVisible(true);
		
		try{
			server = new ServerSocket(5000);
		
			while(true){
				socket = server.accept();
				System.out.println("Conected");
				 print = new PrintWriter(socket.getOutputStream());
				escritores.add(print);
				new Thread(new EscutaCliente(socket)).start();
			}
			
		}catch(Exception exc){
			System.out.println("erro no servidor serverSocket");
			
		}
	}
	private class EscutaCliente implements Runnable{
		Scanner scn2;
		public EscutaCliente(Socket socket){
		try{
			scn2 = new Scanner(socket.getInputStream());	
		  }catch(Exception exc2){
			  System.out.println("erro servidor scanner");
		  }
		}
		@Override
		public void run() {
			try{
			String texto;
			while((texto = scn2.nextLine())!= null){
				System.out.println(texto);
				sendAll(texto);
							
			}
			
			
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}
		
	}
	public static void main(String[] args) {
		new Servidor();

	}

}

18 Respostas

M

Vc precisa de um ip fixo ou de um serviço de dns, tipo o dyndns, no-ip, etc.
Caso use roteador é preciso configurar o dmz dele para a porta local da sua maquina servidora.

[]'s

R

mauricioadl:
Caso use roteador é preciso configurar o dmz dele para a porta local da sua maquina servidora.

[]'s

Eu uso roteador sim como posso configurar o dmz dele?

E

Na página de manutenção dele…

Dependendo do router, você pode vincular a sua conta do no-ip/dyndns diretamente nele.

R

Como posso conectar o quer preciso configurar para que a rede interna se conecte co a externa?

E

Procure no seu modem pela configuração do DMZ e aponte para a sua máquina na LAN… e então quando alguém tentar acessar o seu ip externo (da WAN) ao invés de cair a requisição somente para o modem, este passa adiante para a sua máquina local… Claro que o conceito de DMZ envolve mais coisas, mas o que você precisa é basicamente isso…

R

Ok! no caso se uma rede externa for conectar com a minha rede local o ip dele 200…, vai chegar até a minha rede local 192.168…?

M

isso mesmo!

R

então nesse caso o meu serverSocket vai está esperando na porta 5000, qual ip eu coloco no cliente para encontrar o servidor que está na maquina 192.168… porta 5000?

M

como disse anteriormente vc precisa de um ip de internet fixo ou um servidor de dns onde vc tera um dominio e esse dominio aponta para seu ip dinamico.

E

como o mauricioadl disse, você vai precisar de um ip fixo… Lembre-se que cada vez que você se conecta na WAN você ganha um ip, digamos “187.241.25.98” e esse ip vai mudar quando você se desconectar e conectar novamente… Você pode fazer o teste verificando seu ip na WAN e utilizando ele para a conexão, mas ao desconectar e conectar novamente você vai precisar alterar seu código pois o IP do seu server vai mudar…

Por isso é necessário um IP fixo (que não vai mudar quando vc se reconectar, mas você vai precisar pagar por isso) ou você cria uma conta no dyndns ou no-ip e crie o seu host lá… Assim você vai ter um domínio associado ao seu ip e quando o ip mudar, o domínio apenas redirecionará para o novo ip (tem aplicativos que atualizam seu ip em tempo real, como o No-IP DUC, por exemplo).

R

Criei um host no no-ip na maquina onde eu rodo o server, e agora?

R

alguem!! :?

E

você consegue pingar para o host que você criou?
instalou algum serviço (Apache, por exemplo) e tentou executá-lo no host chamando de uma máquina na WAN para ver se a configuração está certa?

R

erico_kl:
você consegue pingar para o host que você criou?

Como assim?

E

pingar…

ping seuhost.com

está mascarando para seu ip?

R

eu pinguei da maquina do cliente o ip externo do pc onde está o meu server então eu pinguei ping 200.68…, mas eu não consigo o ip de pois do roteador 192.168…

vc poderia dar um exemplo?

E

Você não consegue pingar para a máquina? Somente para o modem? Isso?

Se for isso o DMZ do seu modem não foi configurado corretamente…

Uma dica, entre neste página e abra o seu server ouvindo em alguma porta… Após isso marque a opção “Check port” e informe a porta de escuta do servidor e veja o que aparece… Tente isso da WAN (informando o seu host)

R

Consegui!! :lol:

O que eu fiz foi colocar meu roteador para encaminhar as solicitações para o meu pc na rede (como o pessoal aqui me falou) mas mesmo assim eu não conseguia por que eu estava colocando o meu cliente para procurar o ip publico 200.60… e não encontrava então depois de muitos testes eu observei no status do roteador, que o meu roteador tinha o indereço local 192.168… e tinha o endereço wan 10.20… o que eu fiz foi só colocar o meu cliente para procurar na porta 5000 que era do meu server e o ip wan do roteador 10.20…! e deu certo!!

Quero agradecer ao Erico_kl , mauricioadl que me ajudaram! Valew! :wink:

Criado 17 de agosto de 2012
Ultima resposta 25 de ago. de 2012
Respostas 18
Participantes 3