Problema DatagramSocket

4 respostas
ThomasCouto

Pessoal, estou tendo um problema utilizando UDP: é um simples envio/recepção de mensagens entre um cliente e servidor:

Quando eu rodo no debug mode do eclipse, funciona normalmente… Mas rodando sem ser debug, o receive() do servidor fica bloqueado infinitamente, como se o servidor não percebesse que o pacote chegou…

Alguem poderia me orientar ?

Obrigado.

4 Respostas

ViniGodoy

Posta os códigos aí.

O duro é que se tratando de UDP, é difícil dizer se o pacote chegou mesmo ou não.

ThomasCouto
ViniGodoy:
Posta os códigos aí.

O duro é que se tratando de UDP, é difícil dizer se o pacote chegou mesmo ou não.

Fala ViniGodoy, valeu pela ajuda. Realmente o bug parece ser outro, o que eu descobri que está acontecendo é o seguinte:
Quando primeiro cliente tenta se conectar, o servidor não identifica. O servidor somente está identificando a partir do segundo cliente em diante.. Estranho não ? A aplicação em sí funciona normalmente, após as conexões serem estabelecidas. Vou mostrar o código relativo à conexão UDP, pois há uma factory que cria conexões que podem ser TCP ou UDP (o servidor diz que tipo de servidor ele será), e o cliente diz que tipo de conexão ele vai ter (tcp/udp). A parte TCP está normal.

segue:

public class StringServer_UDP extends StringServer {

	private DatagramSocket socket;

	public StringServer_UDP(int porta) {
		try {
			socket = new DatagramSocket(porta);
			socket.setSoTimeout(0);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	public StringConnection acceptConnection() throws IOException {
		log("Esperando clientes...");
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1023);
		socket.receive(packet);
		log("Novo cliente chegou: "+packet.getAddress().getHostAddress()+" @ "+packet.getPort());
		return new StringConnection_UDP(socket, packet);
	}

}

O código acima parece ser executado corretamente, pois o socket.receive(socket) fica bloqueado até receber o pacote.

O código abaixo é executado pelo cliente onde IP = localhost e porta = 9876 (porta do servidor).

[/code]
public StringConnection_UDP(String ip, int porta) {
		System.out.println(ip);
		System.out.println(porta);
		try {
			dtSocket = new DatagramSocket();
			dtSocket.setSoTimeout(0);
			InetAddress IPAddress = InetAddress.getByName("localhost");
			String h = "hello";
			DatagramPacket sendPacket = new DatagramPacket(h.getBytes(), h.getBytes().length, IPAddress, porta);
			dtSocket.send(sendPacket);
		} catch (SocketException e) {		
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

O que acho mais estranho é o fato de que o servidor só enxerga a partir da segunda conexão do cliente, o que mostra que os códigos acima "funcionam". O problema mesmo, como voce bem falou vini, é que em udp não da pra saber se o pacote realmente chegou, pois não há estabelecimento de conexão como em tcp.

Basicamente é isso,

obrigado.

ViniGodoy

Você tem certeza que o receive do servidor está sendo chamado antes do primeiro send do client?

ThomasCouto

Fala Vini, obrigado pela ajuda. O problema foi resolvido sem querer! hehehe… Estava testando tudo em uma mesma máquina, quando coloquei para trabalhar realmente em um ambiente distribuído tudo funcionou rs…

mistérios do java hehehe

valeu!

Criado 27 de novembro de 2009
Ultima resposta 28 de nov. de 2009
Respostas 4
Participantes 2