読者です 読者をやめる 読者になる 読者になる

PythonでUnixドメインソケットを使って通信する

サーバー側

サーバー側のプログラムは、指定したファイルパスにソケットファイルを作ってクライアント側からの接続を待ち受けます。

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