選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
このリポジトリはアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュや、課題・プルリクエストのオープンはできません。

exemple.rst 3.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. Exemple
  2. =======
  3. Pour ce premier exemple, le client et le serveur vont tourner sur la même machine: la vôtre!
  4. Le processus du serveur tournera dans un premier terminal, et le processus du client dans un autre.
  5. Pour les différencier, on peut utiliser la variable `sys.ps1`.
  6. Étape 1
  7. -------
  8. Ouvrez deux terminaux, lancez dans chacun d'eux la commande `python3` sans arguments, puis tapez::
  9. >>> import sys
  10. >>> sys.ps1 = "(serveur) >>> "
  11. dans le premier, et::
  12. >>> import sys
  13. >>> sys.ps1 = "(client) >>> "
  14. dans le second.
  15. Vous devriez obtenir le résultat suivant::
  16. (serveur) >>>
  17. ::
  18. (client) >>>
  19. Dans chacun d'eux, définissez les variables ``IP`` et ``PORT``::
  20. (serveur) >>> IP = "127.0.0.1"
  21. (serveur) >>> PORT = 3000
  22. ::
  23. (client) >>> IP = "127.0.0.1"
  24. (client) >>> PORT = 3000
  25. L'adresse IP ``127.0.0.1`` est spéciale et désigne votre propre machine.
  26. Le PORT 3000 est un port arbitraire
  27. Étape 2
  28. -------
  29. Dans le REPL du serveur, créez une socket du type 'AF_INET' et 'SOCK_STREAM', puis appelez
  30. ``bind()`` avec le tuple (IP, PORT) [#f1]_ ::
  31. (serveur) >>> IP = "127.0.0.1"
  32. (serveur) >>> PORT = 3000
  33. (serveur) >>> import socket
  34. (serveur) >>> s_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  35. (serveur) >>> s_serveur.bind((IP, PORT))
  36. Ensuite, appelez ``s_serveur.listen(0)``: cela permet à votre serveur d'accepter des connections::
  37. (serveur) >>> s_serveur.listen(0)
  38. Enfin, appelez ``s_serveur.accept`: cette méthode retourne un tuple qu'on note souvent ``con, addr``::
  39. (serveur) >>> con, addr = s_serveur.accept()
  40. Cette fois ci, vous devriez constater que le processus du serveur est *bloqué*: l'invite de commande ne s'affiche
  41. pas - en effet, le serveur est en attente d'une connexion par le client
  42. Étape 3
  43. -------
  44. De la même façon que pour le serveur, créez une socket du même type côté
  45. client::
  46. (client) >>> IP = "127.0.0.1"
  47. (client) >>> PORT = 3000
  48. (client) >>> import socket
  49. (client) >>> s_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  50. Ensuite, *connectez* la socket client à la socket serveur::
  51. (client) >>> s_client.connect((IP, PORT))
  52. Comme par magie, vous devriez voir le processus **dans l'autre terminal** reprendre son exécution:
  53. les deux processus Python sont donc bien en train de *communiquer*
  54. Étape 4
  55. -------
  56. Vous pouvez maintenant utiliser les méthodes ``send()`` et ``recv``, respectivement avec l'objet
  57. ``con`` côté serveur, et ``s_client`` côté client pour envoyer et recevoir des messages entre
  58. les deux processus.
  59. Notez que ``send`` prend des ``bytes`` en arguments et renvoie le nombre d'octets envoyés,
  60. et que ``recv()`` prend un nombre d'octets à lire.
  61. On peut envoyer des message du client vers le serveur::
  62. (client) >>> s_client.send(b"Bonjour")
  63. 7
  64. ::
  65. (serveur) >>> con.recv(7)
  66. b'Bonjour'
  67. Et du serveur vers le client::
  68. (serveur) >>> con.send(b"Comment va ?")
  69. 12
  70. ::
  71. (client) >>> s_client.recv(12)
  72. b'Comment va ?'
  73. .. rubric:: notes
  74. .. [#f1] Il existe des sockets de plusieurs type et avec des comportements différents. AF_INET et SOCK_STREAM sont
  75. les plus courants.