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
Répondre
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.
Incorrect, voir ma réponse, et NIO ne aide pas dans ce domaine le moins du monde. – EJP
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
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
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.
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.
"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
D'accord, modifiant. Reste de ma réponse s'applique toujours. – EJP
@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
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.
- 1. Communication client-serveur Apache MINA Java TCP
- 2. TCP socket communication
- 3. Communication TCP/IP dans Matlab
- 4. Indy Ecrire Buffering/communication efficace TCP
- 5. communication série twoway communication java
- 6. Problème de communication client/serveur .NET TCP
- 7. Aide pour la communication avec le port TCP de Windows
- 8. Quels protocoles TCP sont utilisables pour la communication client-client?
- 9. TCP vs UDP pour la communication par microprocesseur
- 10. Communication Java vers JavaScript
- 11. Java TCP Socket reniflage
- 12. Communication d'objets C++ et Java
- 13. Bonne introduction à la programmation des sockets TCP en Java?
- 14. Comment fonctionne la communication AMF?
- 15. communication entre applications (.NET + java)
- 16. Communication entre instances EJB3 (communication inter-bean Java EE) possible?
- 17. Communication avec une application Web Java à partir d'une application non-java via une socket TCP/IP
- 18. Sockets Java et tuning TCP
- 19. Comment faire la communication socket dans Android?
- 20. Problème de communication réseau Java
- 21. Communication par applet Java avec l'application Rails
- 22. Communication Java ME et Java EE
- 23. Communication par socket?
- 24. La communication entre les
- 25. serveur java pour gérer plusieurs connexions tcp
- 26. Obtenir typeof en Java
- 27. Communication efficace entre les objets Java
- 28. C++ Boost objets sérialisés TCP sur le canal, la communication bidirectionnelle ne fonctionne pas
- 29. Obtenir la valeur char en java
- 30. DLL/TLB en Java <-> Communication DCOM
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