Socket não funciona

7 respostas
jsnpereira

Eu estou aprendendo socket bem básicamente por estudo da faculdade.

eu estava testando a rodar um classe que está socket, mas ocorreu o erro, veja:

Digita o numero da porta:

8080

java.net.UnknownHostException: dominio

at java.net.AbstractPlainSocketImpl.connect(Unknown Source)

at java.net.PlainSocketImpl.connect(Unknown Source)

at java.net.SocksSocketImpl.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.(Unknown Source)

at java.net.Socket.(Unknown Source)

at Cliente.main(Cliente.java:18)

uma classe que eu crirei

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Cliente {
	public static void main(String[] args) {
		Scanner sca = new Scanner(System.in);

		System.out.println("Digita o numero da porta: ");
		int porta = sca.nextInt();

		try {
			Socket s = new Socket("dominio", porta);

			BufferedReader br = new BufferedReader(new InputStreamReader(
					s.getInputStream()));
			PrintWriter pw = new PrintWriter(new OutputStreamWriter(
					s.getOutputStream()));

			System.out.println(br.readLine());

			String str;

			while (!(str = sca.nextLine()).equals("fim")) {
				pw.println(str);
				pw.flush();
				System.out.println(br.readLine());
			}

			pw.println("Encerrado!!");
			pw.flush();

			br.close();
			pw.close();
			s.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Espero que dá dica, obrigado!

7 Respostas

S

Pela exceção, o erro indica que não conhece o host, ou seja, onde você declarou “dominio” troque pelo IP ou hostname da máquina que deseja se conectar, para máquinas locais há dois modos:

Socket sock = new Socket("127.0.0.1", porta); // ex1
Socket sock = new Socket("localhost", porta); // ex2

Além do mais, a porta 8080 pode ser reservada para algum serviço, tente usar outra como 12345 por exemplo.

jsnpereira

solidsnake:
Pela exceção, o erro indica que não conhece o host, ou seja, onde você declarou “dominio” troque pelo IP ou hostname da máquina que deseja se conectar, para máquinas locais há dois modos:

Socket sock = new Socket("127.0.0.1", porta); // ex1
Socket sock = new Socket("localhost", porta); // ex2

Além do mais, a porta 8080 pode ser reservada para algum serviço, tente usar outra como 12345 por exemplo.

Como configurar IP do computador ou seja pegar IP que está no meu computador???

S

jsnpereira:
solidsnake:
Pela exceção, o erro indica que não conhece o host, ou seja, onde você declarou “dominio” troque pelo IP ou hostname da máquina que deseja se conectar, para máquinas locais há dois modos:

Socket sock = new Socket("127.0.0.1", porta); // ex1
Socket sock = new Socket("localhost", porta); // ex2

Além do mais, a porta 8080 pode ser reservada para algum serviço, tente usar outra como 12345 por exemplo.

Como configurar IP do computador ou seja pegar IP que está no meu computador???

Mas numa configuração de Socket você não precisa pegar o IP da máquina que está conectando, mas sim do IP do servidor ao qual quer se conectar e nesse caso não vejo problema em ir travado no fonte, citei o exemplo de localhost, para fins de testar a conexão tendo em vista que seu servidor e seu cliente estão na mesma máquina entende?

Bem de qualquer forma esse tópico pode te ajudar.

jsnpereira

solidsnake:
jsnpereira:
solidsnake:
Pela exceção, o erro indica que não conhece o host, ou seja, onde você declarou “dominio” troque pelo IP ou hostname da máquina que deseja se conectar, para máquinas locais há dois modos:

Socket sock = new Socket("127.0.0.1", porta); // ex1
Socket sock = new Socket("localhost", porta); // ex2

Além do mais, a porta 8080 pode ser reservada para algum serviço, tente usar outra como 12345 por exemplo.

Como configurar IP do computador ou seja pegar IP que está no meu computador???

Mas numa configuração de Socket você não precisa pegar o IP da máquina que está conectando, mas sim do IP do servidor ao qual quer se conectar e nesse caso não vejo problema em ir travado no fonte, citei o exemplo de localhost, para fins de testar a conexão tendo em vista que seu servidor e seu cliente estão na mesma máquina entende?

Bem de qualquer forma esse tópico pode te ajudar.

eu li o topico que vc postou…

eu implementei o código a parte que pega host da máquina.

Código:

public class Cliente {
	public static void main(String[] args) {
		Scanner sca = new Scanner(System.in);

		System.out.println("Digita o numero da porta: ");
		int porta = sca.nextInt();

		InetAddress ia = null;

		try {
			 ia = InetAddress.getLocalHost();
			
			 System.out.println("Endereço: "+ia.getHostAddress());
			 System.out.println("Nome da Máquina: "+ia.getHostName());
			 System.out.println("Porta: "+porta);
			Socket s = new Socket(ia.getHostName(), porta);

			BufferedReader br = new BufferedReader(new InputStreamReader(
					s.getInputStream()));
			PrintWriter pw = new PrintWriter(new OutputStreamWriter(
					s.getOutputStream()));

			System.out.println(br.readLine());

			String str;

			while (!(str = sca.nextLine()).equals("fim")) {
				pw.println(str);
				pw.flush();
				System.out.println(br.readLine());
			}

			pw.println("Encerrado!!");
			pw.flush();

			br.close();
			pw.close();
			s.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

mas apareceu outro pequeno erro:
Digita o numero da porta:

7839

Endereço: XXXXXXXXXXXX

Nome da Máquina: XXXXXXXXXXXX

Porta: 7839

java.net.ConnectException: Connection refused: connect

at java.net.DualStackPlainSocketImpl.connect0(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)

at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)

at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)

at java.net.AbstractPlainSocketImpl.connect(Unknown Source)

at java.net.PlainSocketImpl.connect(Unknown Source)

at java.net.SocksSocketImpl.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.<init>(Unknown Source)

at java.net.Socket.<init>(Unknown Source)

at Cliente.main(Cliente.java:27)
S

O servidor está com a mesma porta (7839) para receber conexões dos clientes?

Como está o código do lado servidor?

jsnpereira
solidsnake:
O servidor está com a mesma porta (7839) para receber conexões dos clientes?

Como está o código do lado servidor?

eu criei a classe servidor e coloca uma porta que recebe número do aleatorio.

Servidor
public class Servidor {
	static int porta;
	static Socket s = null;

	public static void main(String[] args) {
		String opcao;
		Scanner sca = new Scanner(System.in);
		

		porta = gerarPorta();

		try {
			final ServerSocket server = new ServerSocket(porta);
			System.out.println("-------------------------------------");
			System.out.println("----------Cliente do Email-----------");
			System.out.println("Porta: " + porta);
			System.out.println("-------------------------------------");

			final Correio c = new Correio();

			System.out
					.println("Quer adicionar mais um e-mail do servidor? s/n");
			opcao = sca.next();

			if ('s' == opcao.charAt(0)) {
				adicionarEmail(c);
			}

			final ArrayList&lt;Email&gt; emails = c.getLista();

			System.out.println("Lista do E-mail disponiveos do servidor: ");
			for (Email email : emails) {
				System.out.println(email);
			}

			while (true) {
				s = server.accept();
				new Transacao(s, emails);
				
			}
			
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static int gerarPorta() {
		return (int) (Math.random() * 9999);
	}

	public static void adicionarEmail(Correio c) {
		String opcao = null;
		do {

			System.out.println("-------------------------------------");
			System.out.println("Cadastar do E-mail");
			int destino = Integer.parseInt(JOptionPane.showInputDialog("Destino:"));
			String assunto = JOptionPane.showInputDialog("Assunto: ");
			String mensagem = JOptionPane.showInputDialog("Mensagem: ");

			c.addEmail(destino, assunto, mensagem);
			opcao = JOptionPane.showInputDialog("Deseja adicionar mais um e-mail? s/n");
		} while (opcao.charAt(0) == 's');
		
		System.out.println("Cadastro com sucesso!!!");

	}

}
S

Porta de número aleatório para esse tipo de conexão é inviável, pois como o cliente saberá qual porta conectar? Por essa razão a exceção anterior recusou a conexão devido a porta estar fixa.

Também não adianta randomizar a porta no cliente, pois ele nunca será igual ao que o servidor está gerando, resumindo, troque por uma porta fixa, o número 7839 está muito bom para esse fim.

Criado 4 de julho de 2013
Ultima resposta 4 de jul. de 2013
Respostas 7
Participantes 2