PythonでローカルソケットとUNIXソケットを効率的に使う方法

この記事では、PythonでのローカルソケットとUNIXソケットの使い方について詳しく解説します。具体的なコード例とその解説、さらには応用例を2つ含めています。

目次

ローカルソケットとは

ローカルソケット(Local Sockets)は、同一マシン内のプロセス間でデータを送受信する手段として使用されます。通常のネットワークソケットと違い、同一マシン内でしか通信できないため、セキュリティが高いとされます。

UNIXソケットとは

UNIXソケットは、UNIX系のオペレーティングシステムで使用されるIPC(Inter-Process Communication)手段の一つです。ローカルソケットと同じく、これも同一マシン内での通信を前提としています。

Pythonでのローカルソケットの基本的な使い方

Pythonでローカルソケットを使用するには、`socket`ライブラリを用います。以下に基本的なサーバーとクライアントのコード例を示します。

サーバー側のコード

import socket

# サーバーソケットを作成
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

# クライアントからの接続を待つ
connection, address = server_socket.accept()

# データを受信
data = connection.recv(1024)
print(f"Received: {data}")

# コネクションを閉じる
connection.close()

クライアント側のコード

import socket

# クライアントソケットを作成
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8080))

# データを送信
client_socket.sendall(b'Hello, Server')

# ソケットを閉じる
client_socket.close()

PythonでのUNIXソケットの基本的な使い方

サーバー側のコード

import socket
import os

# UNIXソケットのパス
socket_file = '/tmp/unix_socket'

# 既に同じ名前のソケットが存在する場合は削除
if os.path.exists(socket_file):
    os.remove(socket_file)

# サーバーソケットを作成
server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server_socket.bind(socket_file)
server_socket.listen(1)

# クライアントからの接続を待つ
connection, address = server_socket.accept()

# データを受信
data = connection.recv(1024)
print(f"Received: {data}")

# コネクションを閉じる
connection.close()

クライアント側のコード

import socket

# UNIXソケットのパス
socket_file = '/tmp/unix_socket'

# クライアントソケットを作成
client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client_socket.connect(socket_file)

# データを送信
client_socket.sendall(b'Hello, UNIX Server')

# ソケットを閉じる
client_socket.close()

応用例1: ファイル転送

ローカルソケットやUNIXソケットは、ファイル転送にも使用できます。以下は、サーバーがクライアントから送られてきたファイルを受信する例です。

# サーバー側
import socket
import os

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

connection, address = server_socket.accept()

with open('received_file.txt', 'wb') as f:
    while True:
        data = connection.recv(1024)
        if not data:
            break
        f.write(data)

connection.close()

応用例2: シンプルなチャットアプリケーション

同一マシン内で動作するシンプルなチャットアプリケーションも作成可能です。以下はその一例です。

# サーバー側
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

connection, address = server_socket.accept()

while True:
    data = connection.recv(1024)
    print(f"Client says: {data.decode('utf-8')}")
    msg = input("You: ")
    connection.sendall(msg.encode('utf-8'))

まとめ

PythonでのローカルソケットとUNIXソケットの利用方法について解説しました。これらは同一マシン内で高度なプロセス間通信を行うための強力な手段です。特にセキュリティが重要な場合や、オーバーヘッドを減らしたい場合には、これらのソケットが非常に有用です。

コメント

コメントする

目次