LoginSignup
2
2

More than 5 years have passed since last update.

Pythonでソケットを扱う(入門)

Posted at

環境

  • Ubuntu 17.10
  • Python 3.6

参考

https://docs.python.jp/3/howto/sockets.html
https://docs.python.jp/3/library/socket.html

サーバ側

インタープリタを起動して、下記を実行。

>>> import socket
>>> serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> serversocket.bind((socket.gethostname(), 8080))
>>> serversocket.listen(5)
>>> (clientsocket, address) = serversocket.accept()

ブロックされる。(入力を受け付けるプロンプトが進まない)

別のプロセスから接続をする。たとえば、ss -nltpでバインドしているアドレスを調べて、telnetで接続する。

そうすると、ブロックされていた部分が進み、入力できるようになっている。

>>> type(clientsocket)
<class 'socket.socket'>
>>> clientsocket.fileno()
4
>>> clientsocket.getsockname()
('127.0.1.1', 8080)
>>> clientsocket.getpeername()
('127.0.0.1', 53560)

一度の接続で終了しない。


import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), 8080))
serversocket.listen(5)

while True:
    (clientsocket, address) = serversocket.accept()


    print("handle connectin")
    clientsocket.close()

クライアントが送ってきたデータを読み取る。

サーバー側。


import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), 8080))
serversocket.listen(5)

while True:
    (clientsocket, address) = serversocket.accept()
    data = clientsocket.recv(4096)
    print(data.decode('utf-8'))
    clientsocket.close()

クライアント側。コマンドライン上から。

$ echo hello | nc 127.0.1.1  8080

クライアントもPythonで

>>> import socket
>>> clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> clientsocket.connect(("127.0.1.1", 8080))
>>> clientsocket.send(b"hello")
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2