Bonjour à tous et à toutes !
Et oui, encore un soucis sur un projet en Java.
Une fois de plus, je fais appel à vous car je n’ai pas trouvé beaucoup d’explications concernant mon problème d’envoi de données vers un client.
Ça fait plusieurs jours que je bloque dessus. Très rapidement, j’ai remarqué que le problème venait de la fonction "readAllBytes()", utilisable sur InputStream. Je n’ai trouvé que cette petite piste hier soir. Elle semble correspondre à mon problème.
Voici les deux petits exemples de code :
Celui-ci fonctionne.
DataOutputStream os = new DataOutputStream(socketClient.getOutputStream());
os.write(1);
socketClient.getInputStream().readAllBytes();
Celui-là ne fonctionne pas.
DataOutputStream os = new DataOutputStream(socketClient.getOutputStream());
socketClient.getInputStream().readAllBytes();
os.write(1);
L’erreur produite en général est la suivante : java.net.SocketException: Software caused connection abort: socket write error at java.base/java.net.SocketOutputStream.socketWrite0(Native Method).
J’ai essayé de créer des buffers de bytes, de fermer socketClient.getInputStream(). Rien. Et comme il l’est mentionné sur la documentation d’Oracle, j’ai créé des Threads pour chaque nouveau message…mais évidemment, rien de ce que j’ai fait n’a fonctionné.
while (true)
{
socketClient = serveurSocket.accept();
TcpClientService tcpClientService = new TcpClientService(socketClient);
tcpClientService.run();
}
Mon but : J’aimerais avoir la liberté de lire et relire les informations reçues tout en ayant la possibilité d’envoyer des données au client. Ce serait vraiment mieux car actuellement, je fais des traitements sur ce que je reçois, puis pour dire au client que tout est bon, je lui renvoie une réponse (un byte). C’est donc le cas qui correspond au second exemple de code ci-dessus. Je ne travaille presque exclusivement qu’avec des bytes.
Pour en revenir au lien que je vous ai montré, les personnes parlent de sockets non-bloquants. Ok… Mais j’ai vu que la mise en œuvre était vraiment très différente des Sockets habituels et aussi…beaucoup plus compliquée.
Mes questions sont :
-
Y aurai-t’il la possibilité de garder l’ancien système de Sockets (IO au lieu de NIO ?) tout en ayant la possibilité d’envoyer des données à n’importe quel moment ? Si oui, que faudrait-il faire pour que cela puisse fonctionner ?
-
Au final…est-ce que les Sockets non bloquants sont vraiment la solution à mon problème ?
-
J’ai entendu parler de "programmation asynchrone". Est-ce que ça pourrait avoir un rapport ici ?
Voilà, je tiens à m’excuser de nouveau pour ce long sujet. Mais je vous remercie infiniment de l’aide que vous pourrez m’apporter.
Et si vous avez d’autres questions à me poser, n’hésitez pas.
A bientôt !