Защо Java DatagramSocket-а връща false на isConnected когато със сигурност е включен?

+5 гласа
166 прегледа
попитан 2016 юни 8 от Nikola.Nikolov. (3,100 точки)

Следвам си простичък UDP tutorial,но нещо влизам в грешка:

http://www.javatpoint.com/DatagramSocket-and-DatagramPacket - tutorial-а 

//DSender.java  

import java.net.*;  

public class DSender{  

  public static void main(String[] args) throws Exception {  

    try{

        DatagramSocket ds = new DatagramSocket();  

        String str = "Welcome java";  

        InetAddress ip = InetAddress.getByName("127.0.0.1");  

        DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), ip, 3000);  

        ds.send(dp);  

        System.out.println(ds.isConnected());

    } catch(Exception e){

    } finally {

        ds.close();  

    }

  }  

//DReceiver.java  

import java.net.*;  

public class DReceiver{  

  public static void main(String[] args) throws Exception {  

    try{

        DatagramSocket ds = new DatagramSocket(3000);  

        byte[] buf = new byte[1024];  

        DatagramPacket dp = new DatagramPacket(buf, 1024);  

        ds.receive(dp);  

        String str = new String(dp.getData(), 0, dp.getLength());  

        System.out.println(str);  

    } catch(Exception e){

    } finally {

        ds.close();  

    }

  }  

}  

Преди да затворя сокета, правя:

ds.send(dp);

System.out.println(ds.isConnected());

ds.close();

на връзката, но винаги ми връща false, въпреки че със сигурност е свързан, и ми праща съобщение от client-а към сървъра. В JAVA 7 АPI-то пише:

Ако сокета е свързан преди да бъде затворен, тогава този метод ще продължи да ти връща true след като затвориш сокета.

Понеже call-нах isConnected() метода преди да е затворен, трябва да връща true. Използвал съм и getPort() метода, който винаги ми връща “-1“, което също показва,че не е свързано,въпреки че е.

Ако сокета е свързан преди да бъде затворен, тогава този метод ще връща порта на свързване дори и след като бъде затворен.

Какво става?

1 отговор

0 гласа
отговорени 2016 юни 9 от G.Ivanoff. (920 точки)
избран 2016 юни 9 от Nikola.Nikolov.
 
Най-добър отговор

За да направиш isConnected() да ти връща true, трябва да connect-неш DatagramSocket-а първо към някакъв InetAdress,и порт, като използваш метода public void connect(InetAddress host, int port).

Ако не го свързваш към правилния Inet адрес и порт... то е ясно,че ще ти даде false. 

Пробвай го в кода си.

От http://www.amazon.com/dp/1449357679/?tag=stackoverfl08-20 

connect() методът всъщност не осигурява връзка в отношение на TCP-то. Но наистина пише,че DatagramSocket-а ще праща и получава пакети от указания хост и порт. Опитите да пращаш пакети към други remote хостове или портове ще ти throw-ват IllegalArgumentException. Пакетите, получени от други хостове или портове ще бъдат отхвърлени без exception или друг notification.

Security check се прави когато connect() метода е извикан. Ако VM-а е allow-нат да праща данни до хоста и порта,check-а се pass-ва без проблеми. Ако пък не – ти пуска SecurityException. Веднъж направи ли се връзка, send() и recieve() на DatagramSocket-а няма да прави security check-ове, които обикновено би направил.

Почти същото е за :

public int getPort()

Ако и единствено DatagramSocket-а е свързан, getPort() метода връща remote порт,към който е свързван. Иначе ти връща “-1”

А относно 

public void disconnect()

disconnect() метода “прекъсва” връзката на вързан DatagramSocket,така че да може отново да праща и получава пакети от всеки хост или порт.

коментиран 2016 юни 9 от Nikola.Nikolov. (3,100 точки)
Благодаря за отговора, всичко е точно.
...