DatagramChannel

15 respostas
S

não estou conseguindo deixar o servidor udp (java.nio) no ar escutando uma porta.
alguem pode me ajudar

...
DatagramChannel channel = DatagramChannel.open( );
DatagramSocket socket = channel.socket( );
socket.bind (new InetSocketAddress (portNumber)); 

while(true)
{
   try{
	ByteBuffer packetIn = ByteBuffer.allocate(packetSize);
	int leitura = channel.read(packetIn);
...
   }catch(Exception e){
	System.out.println("Socket fora do ar " + e.getMessage());
   }
...

valeus…
Luiz

15 Respostas

_fs

Olá, bem vindo.

O que ocorre?

dica: não faça isso

catch(Exception e){ System.out.println("Socket fora do ar " + e.getMessage()); }
mas sim isso

catch(Exception e){ System.out.println("Socket fora do ar." ); e.printStackTrace(); }

S

Salve Lipe
o que ocorre é que o socket não recebe a mensagem, ele fica no loop sempre imprimindo a Exception. Não sei se tem algum outro jeito de fazer um servidor com o DataGramChannel.

Sobre o e.printStackTrace() ele faria o java parar de rodar, não é. E isto não pode ocorrer …

valeuz
[]´s
Luiz

Rafael_Nunes

Siborges:
Sobre o e.printStackTrace() ele faria o java parar de rodar, não é. E isto não pode ocorrer …

Nope, ele vai imprimir o Stack Trace, toda a ‘rota de objetos’ que foi seguida. Com o e.getMessgae() ele vai imprimir somente a mensagem de erro.

S

Valeu Rafael…
valeu mesmo cara, achava que ele cortava o programa…

mas o outro erro ainda não encontrei solução.. :(

[]´s
Luiz

_fs

Pode postar o stackTrace da exceção pra gente?

S
java.nio.channels.NotYetConnectedException

at sun.nio.ch.DatagramChannelImpl.read(Unknown Source)

at SocketServerDataGram.comunica(SocketServerDataGram.java:43)

at SocketServerDataGram.main(SocketServerDataGram.java:27)

Pelo que entendi, me parece que ele não esta agindo como um servidor de socket, e sim como um cliente… :cry:

C

Qual o objetivo, da sua aplicação? Vc é obrigado a usar DatagramChannel?

S

Por azar meu, sim… sou obrigado a usar Datagram…
tenho um sistema unix que se conecta em um servidor udp e passa os dados. Preciso que o server em java fique escutando a porta “X” para receber esses dados.

C
//Enviar
InetAddress IPAddress = InetAddress.getByName("127.0.0.1");
DatagramSocket clientSocket = new DatagramSocket();
byte[] sendData = new byte[1024];
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket); 

//Receber

pra ficar recebendo inifinitamente, coloca algum loop do tipo while(true)
DatagramSocket serverSocket = new DatagramSocket(9876); //porta q ficará sendo escutada
byte[] receiveData = new byte[1024]; 
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
serverSocket.receive(receivePacket);
cv1

Luiz, esse while(true) nao ta com uma cara boa - voce nao pode fazer com que a condicao do while seja o socket estar conectado? A excecao que vc esta levando eh bem clara: voce esta tentando dar um read() num socket que esta Not Yet Connected :slight_smile:

S

Ai é que tá…
eu estou usando a biblioteca java.nio devido as facilidades que o ByteBuffer me garante. E queria usar o DatagramChannel não o DatagramSocket do java.io

S

Cv.
eu tentei utilizar o while(channel.isConnected())
mas como na primeira passagem o cara não estava conectado ele pulava pra proxima instrução após o while e encerrava o socket.

cv1

Bom, entao vc tem um problema com a sua logica, nao com a API da New I/O :slight_smile:

S

Pode ser tb, cara… nunca descartei isso, até estou vendo se consigo ajuda com a galera do guj…

_fs
<lendo mente>

do…while( channel.isConnected() )

?

</lendo mente>
Criado 7 de junho de 2005
Ultima resposta 9 de jun. de 2005
Respostas 15
Participantes 5