Python ネットワークプログラミング - TCP サーバーのマルチスレッド処理

関連タグ:1.Empower Your Web with Python
2. Shodan and Python API

概要


TCP サーバーは複数のクライアントと同時にソケットを確立し、1 つのスレッドで 1 つのクライアントを管理します。

実装手順



1. socket パッケージをインポートする
import socket

2. サーバーソケットを作成する
socket.socket(AddressFamily, Type)
socket.AF_INET は IPv4 を表します
SOCK_STREAM は TCP を意味します
複数のクライアントに対応するためポート多重化を設定します
tcp_server_socket = socket.socket ( socket.AF_INET , socket.SOCK_STREAM ) _ _ _ _ _ _

#ポート多重化 サーバー終了時にポートを即座に解放
tcp_server_socket.setsockopt ( socket.SOL_SOCKET , socket.SO_REUSEADDR , True ) _ _ _ _ _ _

3. ポート番号をバインドする
tcp_server_socket.bind
第 1 パラメーターは IP アドレスを表します。通常は IP を指定せず、マシン上のすべての IP を表します
第 2 パラメーターはポート番号です
tcp_server_socket.bind (( ' ' , 9090 ) )

4. リスニングを設定する
接続確立を待つ最大接続数を 128 に設定します
tcp_server_socket.listen ( 128 ) _ _

5. クライアントからの接続リクエストを待つ
クライアントとサーバーの接続が確立するたびに新しいソケットが返されます
while True :
new_client , ip_port = tcp_server_socket.accept ( ) _
sub_thresd = threading . Thread ( target = handle , args = ( ip_port , new_client ))
sub_thresd.start ( ) _

6. データを受信する
新しく返されたソケットを使用してメッセージを送受信します
rece_data = new_client.recv ( 1024 ) _ _
if rece_data :
rece_data = rece_data.decode ( ' utf -8' )
print ( "The received data is" , rece_data )

7. データを送信する
send_content = "Problem in progress"
send_data = send_content.encode ( ' utf -8' )
new_client.send ( send_data ) _ _
new_client.close ( ) _

8. ソケットを閉じる
tcp_server_socket.close ( ) _


コード:
import socket
import threading


def handle ( ip_port , new_client ):
print ( "The client's ip and port number is: " , ip_port )
while True :
# 5. データを受信する
# 新しく返されたソケットを使用してメッセージを送受信する
rece_data = new_client.recv ( 1024 ) _ _
if rece_data :
rece_data = rece_data.decode ( ' utf -8' )
print ( "The received data is" , rece_data )
# 6. データを送信する
send_content = "Problem in progress"
send_data = send_content.encode ( ' utf -8' )
new_client.send ( send_data ) _ _
new_client.close ( ) _
else :
print ( "Client is offline" , ip_port )
break


if __name__ == '__main__' :
# 1. サーバーソケットを作成する
# socket.AF_INET は IPv4 を表します
# SOCK_STREAM は TCP を意味します
tcp_server_socket = socket.socket ( socket.AF_INET , socket.SOCK_STREAM ) _ _ _ _ _ _
tcp_server_socket.setsockopt ( socket.SOL_SOCKET , socket.SO_REUSEADDR , True ) _ _ _ _ _ _
#ポート多重化 サーバー終了時にポートを即座に解放
#socket.SOL_SOCKET は現在のソケットを表します
#socket._RetAddress 多重化オプション
#True で多重化を有効にします
# 2. ポート番号をバインドする
# 第 1 パラメーターは IP アドレスを表します。通常は設定不要で、マシン上のすべての IP を表します
#第 2 パラメーターはポート番号を表します
tcp_server_socket.bind (( ' ' , 9090 ) )
# 3. リスニングを設定する
# 128: 接続確立を待つ最大接続数を表します
tcp_server_socket.listen ( 128 ) _ _
# 4. クライアントからの接続リクエストを待つ
#クライアントとサーバーの接続が確立するたびに新しいソケットが返されます
while True :
new_client , ip_port = tcp_server_socket.accept ( ) _
sub_thresd = threading . Thread ( target = handle , args = ( ip_port , new_client ))
sub_thresd.start ( ) _


# 7. ソケットを閉じる
tcp_server_socket.close ( ) _


著作権に関する声明:本記事のコンテンツは Alibaba Cloud の実名登録ユーザーによる投稿です。著作権は原作者に帰属します。Alibaba Cloud デベロッパーコミュニティは著作権を有さず、相応の法的責任も負いません。具体的なルールについては、「Alibaba Cloud デベロッパーコミュニティユーザーサービス契約」および「Alibaba Cloud デベロッパーコミュニティ知的財産保護ガイドライン」をご参照ください。本コミュニティにおいて盗用の疑いがあるコンテンツを発見した場合は、侵害申立フォームに記入して報告してください。確認後、本コミュニティは疑義のある侵害コンテンツを直ちに削除します。

関連記事

特別オファーをもっと見る

  1. Short Message Service (SMS) & Mail Service

    5 万通のメールパッケージが USD 1.99 から、120 通のショートメッセージが USD 1.00 から。

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.