Quelques questions java Datagramme Socket
Récemment, j'ai le nez plongé dans la douille de la programmation à l'aide de java, et j'ai un peu de type de questions.
Il y a une méthode bind (), ainsi que d'une connexion() et disconnect(). Il n'y a pas de unbind(). Est-ce parce que lors de la déconnexion de la prise est indépendant? Ne la collecte des ordures s'en occuper une fois le programme s'arrête? Ou est-ce même pas une question valable?
Aussi, lors de la création d'un DatagramSocket, comment est-il différent si je ne fournissent le port et l'adresse? Je suis entrain de créer un programme de recueillir des données à partir d'un réseau, car les données qui flotte autour de et journal. Devrais-je utiliser l'adresse locale? Ne pouvait pas l'aide de l'adresse quand j'ai créer le socket pour me forcer à ne pas être en mesure de recueillir des paquets?
Je suis juste essayer d'obtenir une meilleure compréhension sur les rouages de ces choses.
source d'informationauteur Cat
Vous devez vous connecter pour publier un commentaire.
Il y a environ 15 questions indépendantes dans il y, mais je vais faire de mon mieux pour y remédier:
bind()
est séparé deconnect()
etdisconnect()
. Bind est utilisé pour lier un socket sur un port particulier -- efficacement à "écouter" pour les connexions alors queconnect()
est utilisé pour ouvrir une connexion à un socket qui est déjà à l'écoute sur un port particulier. L'équivalent deunbind()
estclose()
C'est une question valable, bien que la collecte des ordures est une technologie utilisée pour la gestion de la mémoire, pas de prise/OS de la gestion des ressources. Si vous ne relâchez pas un port particulier, il restera associé à votre application jusqu'à ce que votre application se termine et il sera ensuite récupérée par le système d'exploitation. C'est l'OS au niveau de la fonctionnalité, pas JVM fonctionnalités, etc.
À un certain point, vous devez fournir l'adresse internet et le port ou le support que vous souhaitez connecter ou de se lier à. Il n'y a pas moyen de contourner cela.
Je ne suis pas sûr de ce que vous demandez là, tu parles de la journalisation de tous les paquets sur le réseau, aka un espion? Qui va demander de plus que de simples datagramme de programmation. En fait, vous avez à injecter vous-même à la carte réseau de niveau pour intercepter les paquets à mesure qu'ils sont lus hors de la ligne. De quoi vous parlez, vous permettra seulement de recevoir des paquets qui sont envoyés au port spécifique que vous êtes en train d'écouter.
Un
DatagramSocket
reste lié, lorsqu'il est déconnecté, c'est leclose()
méthode qui permettrait de dissocier. Notez que pour une UDP (datagramme) la prise de la sémantique deconnect()
etdisconnect()
sont différentes par rapport à un TCP (ou autre orienté connexion) socket. UDP est un protocole sans connexion et d'un bondDatagramSocket
pouvez envoyer et recevoir des paquets sans être "connecté". Leconnect()
méthode a un caractère purement local effet qu'il provoque le socket seulement être en mesure d'envoyer et de recevoir des paquets de données à un hôte/port, c'est à dire en agissant comme un filtre. UnDatagramSocket
connecté à une multidiffusion ou de diffusion adresse ne sera en mesure d'envoyer des paquets et de ne pas les recevoir.bind(SocketAddress)
est utilisé pour attacher un socket à une adresse locale/port de combinaison, avant qu'une socket est lié, il ne peut pas recevoir ou envoyer de paquets. Le comportement par défaut des constructeurs est de lier la prise immédiatement. Pour créer un indépendant 'DatagramSocket' utiliser leDatagramSocket(SocketAddress)
constructeur passantnull
comme argument. Il est alors possible d'appliquer toute configuration personnalisée à la prise de courant avant de se lier avecbind()
.Autant que je sache ouvert
DatagramSocket
qui est hors de portée sera la cause d'une fuite de ressources, l'objet peut être nettoyée, mais je suis sûr que le sous-jacent socket UDP restera attribué par le système d'exploitation jusqu'à ce que le processus de JVM sorties.Si une adresse n'est pas indiquée avant que le socket est lié, quand il est lié, il va s'attacher à l'adresse générique (
INADDR_ANY
), il est capable de recevoir et d'envoyer des paquets d'adresses locales (sauf si c'est plus tard "connecté" à certains d'accueil). Si un port n'est pas spécifié (ou spécifié à 0), alors le socket est lié à une partie du port choisi par le système d'exploitation (port éphémère).Edit: Un exemple