2010-06-08 7 views
3

J'ai écrit un programme de socket en Java. Le serveur et le client peuvent envoyer/recevoir des données les uns aux autres. Mais j'ai trouvé que si le client envoie des données au serveur en utilisant TCP, TCP interne envoie un accusé de réception au client une fois que les données sont reçues par le serveur. Je veux détecter ou gérer cette reconnaissance. Comment puis-je lire ou écrire des données dans TCP afin que je puisse gérer l'accusé de réception TCP. Merci. Les données envoyées sur un socket TCP sont acquittées dans les deux sens.Comment obtenir l'acquittement dans la communication TCP en Java

+0

Veuillez considérer supprimer les références à TCP et parler uniquement du comportement au niveau de l'application. Le client envoie une requête au serveur qui le reçoit. Le serveur renvoie un message * de l'application * au client en tant que réponse, mais le client ne reçoit jamais la réponse. Est-ce ce que vous essayez de dire? – Gray

Répondre

2

Les données envoyées du client au serveur sont les mêmes que les données envoyées du serveur au client en ce qui concerne les communications par câble TCP et la signalisation d'application. Comme l'indique @Eric, il n'y a aucun moyen d'obtenir cette signalisation.

Il se peut que vous parliez de temporisation en attendant la réponse du serveur. Que vous souhaitez détecter si une réponse prend trop de temps. Est-il possible que le message du client soit plus grand que la réponse du serveur, de sorte que la mise en mémoire tampon entrave la réponse, mais pas la requête initiale? Avez-vous essayé d'utiliser des sockets non bloquantes?

Si vous ne l'avez pas encore fait, vous pouvez jeter un oeil au NIO code. Il a un certain nombre de classes qui vous donnent un contrôle plus fin sur les communications socket.

+0

Incorrect, voir ma réponse, et NIO ne aide pas dans ce domaine le moins du monde. – EJP

+0

Je suis désolé, comment est-ce incorrect? Quelle est la différence entre un octet envoyé du client au serveur et un serveur au client? Je soupçonne que la question confond les sockets TCP avec (comme vous le faites allusion à) la mise en mémoire tampon et d'autres questions qui est la raison pour laquelle je mentionne non-bloquant et NIO. – Gray

+0

C'est incorrect car cela ne répond pas à la question. Il veut «détecter ou gérer cette reconnaissance» et il n'y a rien dans cette réponse qui l'adresse. – EJP

3

Cela n'est tout simplement pas possible, même si vous avez programmé en C directement sur l'API native sockets OS. L'un des points de l'API Sockets, c'est que cela résume cela pour vous.

L'envoi et la réception de données sur la couche TCP ne sont pas nécessairement corrélés avec vos appels Java pour envoyer ou recevoir des données. Les données que vous envoyez dans un appel Java peuvent être divisées en plusieurs parties qui peuvent être tamponnées, envoyées et reçues indépendamment, ou même reçues en désordre.

Voir here pour plus d'informations à ce sujet.

1

Je souhaite détecter ou gérer cet accusé de réception.

Il n'existe aucune API pour la réception ou la détection des ACK à un niveau quelconque au-dessus de la pile de protocoles.

Repensez votre exigence. Sachant que les données ont obtenu au serveur n'est pas utile à une application. Ce que vous voulez savoir, c'est que l'application pair l'a reçue, auquel cas vous devez obtenir l'application homologue à reconnaître au niveau du protocole d'application.

+0

"TCP/IP pratique 'ACK sélectif' Tous les octets/paquets/segments ne sont pas reconnus." Comme je l'ai lu, c'est incorrect. SACK consiste à informer l'expéditeur que les paquets en amont des paquets manquants ont été reçus, de sorte que seuls les paquets manquants doivent être retransmis. Si un paquet arrive sur le récepteur, il sera accusé de réception, soit dans un accusé de réception spécifique, soit dans le cadre d'un accusé de réception cumulatif. – Gray

+0

D'accord, modifiant. Reste de ma réponse s'applique toujours. – EJP

+0

@downvoter S'il vous plaît expliquer. Downvotes inexpliquées sont vraiment juste du vandalisme sur le site. Si vous pensez réellement qu'il existe une API au-dessus de la pile de protocoles pour recevoir ou détecter des ACK, veuillez nous dire ce que vous pensez. – EJP

1

Ceci n'est pas possible en Java pur puisque l'API réseau Java gère tous les sockets, ce qui cache tous les détails TCP.

Vous avez besoin d'un protocole capable de gérer les données de la couche IP pour pouvoir obtenir des en-têtes TCP. DLPI est l'API la plus populaire pour ce faire,

http://www.opengroup.org/onlinepubs/9638599/chap1.htm

Malheureusement, il n'y a pas Java mise en œuvre de ce réseau. Vous devez utiliser le code natif via JNI pour ce faire.

Questions connexes