サーバー側
サーバー側のプログラムは、指定したファイルパスにソケットファイルを作ってクライアント側からの接続を待ち受けます。
server.py
この例では、 /tmp/myapp.sock というパスにソケットファイルを作成します。クライアント側から送信されたデータを標準出力に出力し、同じ内容を送り返します。
import os import sys import socket class Server: def __init__(self, socket_path): self.socket_path = socket_path def start(self): s = self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.bind(self.socket_path) s.listen(1) try: while True: connection, address = s.accept() sys.stdout.write("connected\n") self.accepted(connection, address) sys.stdout.write("disconnect\n") finally: os.remove(self.socket_path) def accepted(self, connection, address): """echo the received data """ data = connection.recv(1024) sys.stdout.write("receive from client: {}\n".format(data.decode())) connection.send(data) sys.stdout.write("send to client: {}\n".format(data.decode())) def main(): server = Server('/tmp/myapp.sock') server.start() if __name__ == '__main__': main()
クライアント側
クライアント側は、サーバーが作ったソケットファイルに接続し、データを送受信します。
client.py
この例では、 /tmp/myapp.sock というパスに接続します。サーバーに「Hello」というメッセージを送った後、サーバーからの応答を標準出力に出力します。これを3回繰り返します。
import sys import socket class Client: def __init__(self, socket_path): self.socket_path = socket_path def start(self): # 3回Helloと送る for idx in range(3): s = self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.connect(self.socket_path) message = "Hello" sys.stdout.write("send to server ({}): {}\n".format(idx, message)) s.send(message.encode()) data = s.recv(1024) sys.stdout.write("receive from server: {}\n".format(data.decode())) s.close() def main(): client = Client('/tmp/myapp.sock') client.start() if __name__ == '__main__': main()
実行結果
$ python server.py connected receive from client: Hello send to client: Hello disconnect connected receive from client: Hello send to client: Hello disconnect connected receive from client: Hello send to client: Hello disconnect
$ python client.py send to server (0): Hello receive from server: Hello send to server (1): Hello receive from server: Hello send to server (2): Hello receive from server: Hello