環境
- 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")