Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのソケットプログラミングで作るシンプルなチャットルーム【サーバー・クライアント解説】

この記事では、Pythonのソケットプログラミング(Socket Programming)を使って、サーバーとクライアントがリアルタイムにやり取りできるシンプルなチャットルームシステムの作り方を解説します。基本的な仕組みを理解すれば、LAN環境での簡易チャットツールとしてすぐに応用できます。

ソケットとは?

ソケット(Socket)とは、通信チャネルの両端にあたる「エンドポイント」のことです。サーバーとクライアントをつなぐ役割を担っており、データの送受信が双方向(Bi-Directional)に行えるのが特徴です。

今回の仕組みでは、サーバー側とクライアント側のそれぞれにソケットを用意し、サーバーを中継点としてクライアント同士のチャットを実現します。サーバーは特定のポートで接続を待ち受け、クライアントが同じポートに対して接続を試みると、チャットルームとしてのコネクションが確立されます。

システム全体の構成

このシステムは大きく分けてサーバー側クライアント側の2つのパートで構成されています。

  • サーバー側: スクリプトを実行すると接続要求を待ち受け、接続が確立されるとクライアントとメッセージの送受信を開始します。
  • クライアント側: サーバーのIPアドレスを指定して接続し、サーバーと対話形式でメッセージを交換します。

ここでは動作確認のためlocalhost(ローカルホスト)を使用していますが、マシンがLANで接続されている場合は、IPアドレスを指定することで別のPC間でも通信できます。サーバーは起動時に自身のIPアドレスを表示し、サーバー名の入力を求めます。クライアント側では、自分の名前と接続先サーバーのIPアドレスを入力する仕組みです。

サーバー側のコード

まずはサーバー側のスクリプトです。ホスト名とIPアドレスを取得し、ポート1234番でバインドして待ち受けを行います。

import time, socket, sys

print('Setup Server...')
time.sleep(1)

# ホスト名とIPアドレスを取得し、ポートを設定
soc = socket.socket()
host_name = socket.gethostname()
ip = socket.gethostbyname(host_name)
port = 1234
soc.bind((host_name, port))

print(host_name, '({})'.format(ip))
name = input('Enter name: ')
soc.listen(1)  # 接続を待ち受ける
print('Waiting for incoming connections...')

connection, addr = soc.accept()
print("Received connection from ", addr[0], "(", addr[1], ")\n")
print('Connection Established. Connected From: {}, ({})'.format(addr[0], addr[1]))

# クライアントから接続を受け取る
client_name = connection.recv(1024)
client_name = client_name.decode()
print(client_name + ' has connected.')
print('Press [bye] to leave the chat room')
connection.send(name.encode())

while True:
    message = input('Me > ')
    if message == '[bye]':
        message = 'Good Night...'
        connection.send(message.encode())
        print("\n")
        break
    connection.send(message.encode())
    message = connection.recv(1024)
    message = message.decode()
    print(client_name, '>', message)

サーバー側コードのポイント

  • socket.gethostname()socket.gethostbyname() で自マシンのホスト名とIPアドレスを取得します。
  • soc.bind((host_name, port)) でソケットをポート1234番に関連付けます。
  • soc.listen(1) で接続要求の待ち受けを開始し、soc.accept() でクライアントからの接続を受け入れます。
  • [bye] という文字列を入力すると、終了メッセージを送信してチャットを終了します。

クライアント側のコード

続いてクライアント側のスクリプトです。サーバーのIPアドレスと自分の名前を入力し、サーバーへ接続します。

import time, socket, sys

print('Client Server...')
time.sleep(1)

# 自身のホスト名とIPアドレスを取得
soc = socket.socket()
shost = socket.gethostname()
ip = socket.gethostbyname(shost)

# サーバーへの接続情報を入力
print(shost, '({})'.format(ip))
server_host = input("Enter server's IP address:")
name = input("Enter Client's name: ")
port = 1234

print('Trying to connect to the server: {}, ({})'.format(server_host, port))
time.sleep(1)
soc.connect((server_host, port))
print("Connected...\n")

soc.send(name.encode())
server_name = soc.recv(1024)
server_name = server_name.decode()
print('{} has joined...'.format(server_name))
print('Enter [bye] to exit.')

while True:
    message = soc.recv(1024)
    message = message.decode()
    print(server_name, ">", message)
    message = input(str("Me > "))
    if message == "[bye]":
        message = "Leaving the Chat room"
        soc.send(message.encode())
        print("\n")
        break
    soc.send(message.encode())

クライアント側コードのポイント

  • soc.connect((server_host, port)) で指定したIPアドレスとポートのサーバーに接続します。
  • 接続後、最初に自分の名前を送信し、サーバー名を受信して表示します。
  • メッセージは send() でエンコードして送信し、recv() で受信したデータを decode() して表示します。
  • [bye] を入力すると退出メッセージを送り、ループを抜けて終了します。

実行手順

  1. サーバー側スクリプトを先に実行し、サーバー名を入力して接続待ち状態にします。
  2. 別のターミナル(または別のPC)でクライアント側スクリプトを実行します。
  3. サーバーのIPアドレスとクライアント名を入力すると、接続が確立されチャットが開始できます。
  4. どちらかが [bye] を入力すると会話を終了します。

まとめ

このように、Pythonの標準ライブラリである socket モジュールだけで、双方向通信が可能なチャットルームを簡単に構築できます。まずはlocalhostで動作を確認し、慣れてきたらLAN上のIPアドレスを指定して複数マシン間での通信に挑戦してみてください。スレッド処理を組み合わせれば複数クライアント対応のチャットサーバーへ発展させることもでき、ネットワークプログラミングの基礎を学ぶ絶好の題材です。

  1. Python Tkinterで作る簡単な登録フォーム入門

    Tkinterは、GUI(グラフィカルユーザーインターフェース)を開発するためのPython標準ライブラリです。Tkinterを使うことで、ウィンドウをはじめとするさまざまなUI(ユーザーインターフェース)要素を持つデスクトップアプリケーションを作成できます。推奨されているPython 3.xを使用している場合、TkinterはPythonに標準搭載されているパッケージなので、追加のインストールは一切不要です。この記事では、まずTkinterの基本的なGUIアプリケーションの作り方を解説し、その後、実際の登録フォームやローン金利計算ツールといった実用的な例まで段階的に見ていきます。シンプルなG

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c