ホームページ > バックエンド開発 > Python チュートリアル > Pythonのソケットモジュールの詳しい説明

Pythonのソケットモジュールの詳しい説明

巴扎黑
リリース: 2017-08-21 14:53:17
オリジナル
3717 人が閲覧しました

Socket の本来の英語の意味は「穴」または「ソケット」です。 BSD UNIX のプロセス通信メカニズムとして、一般に「ソケット」とも呼ばれます。これは、IP アドレスとポートを記述するために使用され、通信チェーンのハンドルであり、異なる仮想マシンまたは異なるコンピューター間の通信を実装するために使用できます。 。

ネットワーク上の 2 つのプログラムは、双方向通信接続を通じてデータを交換します。この接続の一端はソケットと呼ばれます。

ネットワーク通信接続を確立するには、少なくともペアのポート番号 (ソケット) が必要です。ソケットは本質的には TCP/IP をカプセル化するプログラミング インターフェイス (API) であり、TCP/IP はプログラマーがネットワーク開発に使用するインターフェイスも提供します。これは、ソケット プログラミング インターフェイスであり、カプセル化または表示する手段を提供します。データ。ソケットはネットワーク通信機能を提供します。

Pythonのソケットについて話しましょう。

1.socketモジュール

ソケットを作成するにはsocket.socket()関数を使用します。構文は次のとおりです:

socket.socket(socket_family,socket_type,protocol=0)

socket_family には次のパラメータを指定できます:

socket.AF_INET IPv4 (デフォルト)

socket.AF_INET6

sock et.AF_UNIX では、単一の Unix システムのプロセス間通信にのみ使用されます

socket_type は次のパラメータになります:

socket.SOCK_STREAM ストリーミングソケット、TCP 用 (デフォルト)

socket.SOCK_DGRAM データグラムソケット、UDP 用

socket.SOCK_RAW Raw ソケット通常のソケットは ICMP や IGMP などのネットワーク メッセージを処理できませんが、SOCK_RAW は処理できます。次に、SOCK_RAW は特殊な IPv4 メッセージも処理できます。さらに、生のソケットを使用すると、ユーザーが IP_HDRINCL ソケット オプションの IP ヘッダーを介してメッセージを構築できます。

socket.SOCK_RDM は UDP の信頼できる形式であり、データグラムの配信を保証しますが、順序は保証しません。 SOCK_RAM は、元のプロトコルへの低レベルのアクセスを提供するために使用され、ICMP メッセージの送信など、特定の特殊な操作を実行する必要がある場合に使用されます。 SOCK_RAM は通常、パワー ユーザーまたは管理者によって実行されるプログラムに制限されます。

socket.SOCK_SEQPACKET 信頼性の高い連続パケットサービス

プロトコルパラメータ:

0 (デフォルト) 0の場合、システムはアドレス形式とソケットカテゴリに基づいて自動的に選択します。プロトコル

2.ソケットオブジェクトの組み込みメソッド

サーバー側のソケット関数

s.bind() アドレス(IPアドレス、ポート)をソケットにバインド、パラメータはタプル形式である必要があります 例: s.bind (('127.0.0.1',8009))

s.listen(5) リッスンを開始します。5 は保留中の接続の最大数です

s.accept() クライアント接続を受動的に受け入れ、ブロックし、接続を待機します

Clientソケット関数

s.connect() サーバーに接続します。パラメータはタプル形式である必要があります。例: s.connect(('127,0.0.1',8009))

公共目的のソケット関数

s .recv(1024) TCP データを受信します。1024 は 1 回のデータ受信のサイズです

s.send(bytes) TCP データを送信します。Python3 の送信データの形式はバイト形式である必要があります

s.sendall( ) データを送信します内部ループはsend

s.close()を呼び出してソケットをクローズします

例1. ソケットプログラムの簡単な実装

サーバー側

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import socket
import time
IP_PORT = ('127.0.0.1',8009)
BUF_SIZE = 1024
 
tcp_server = socket.socket()
tcp_server.bind(IP_PORT)
tcp_server.listen(5)
 
while True:
    print("waiting for connection...")
    conn,addr = tcp_server.accept()
    print("...connected from:",addr)
    while True:
        data = tcp_server.recv(BUF_SIZE)
        if not data:break
        tcp_server.send('[%s] %s'%(time.ctime(),data))
 
tcp_server.close()
ログイン後にコピー

上記コードの説明:

1~4行

最初の行はUnixの起動情報行で、その後にtimeモジュールとsocketモジュールがインポートされます

5~10行

IP_PORTはグローバル変数のIPアドレスとポートを宣言しており、bind()関数がこのアドレスとバッファーにバインドされます。サイズは 1K に設定され、listen() 関数は、同時に受信できる接続の最大数を示します

11~ 最後の行まで

サーバーのループに入ったら、接続が到着するまで受動的に待ちます。接続がある場合は、会話ループに入り、クライアントがデータを送信するのを待ちます。メッセージが空の場合は、クライアントが終了したことを意味し、ループから抜け出して次の接続の到着を待ちます。クライアント メッセージを取得したら、メッセージの前にタイムスタンプを追加して戻ります。ループが終了せず、サーバーが close() を実行しないため、最後の行は実行されません。 close() 関数を呼び出すことを忘れないように注意してください。

クライアント側

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import socket
 
HOST = '127.0.0.1'
PORT = 8009
BUF_SIZE = 1024
ADDR = (HOST,PORT)
 
client = socket.socket()
client.connect(ADDR)
 
while True:
    data = input(">>> ")
    if not data:break
    client.send(bytes(data,encoding='utf-8'))
    recv_data = client.recv(BUF_SIZE)
    if not recv_data:break
    print(recv_data.decode())
     
client.close()
ログイン後にコピー

5~11行目

HOST変数とPORT変数はサーバーのIPアドレスとポート番号を表します。デモは同じサーバー上にあるため、IP アドレスはすべて 127.0.0.1 になります。他のサーバーで実行する場合は、対応する変更を行う必要があります。ポート番号はサーバーのポート番号と正確に一致する必要があります。一致しないと通信できません。バッファサイズは 1K のままです。

10 行目でクライアントソケットが作成され、サーバーに接続されます

13~21 行目

クライアントも無限ループします。 次の 2 つの条件のいずれかが発生すると、クライアントのループは終了します。 1. ユーザー 入力が空です。またはサーバー側の応答メッセージが空です。それ以外の場合、クライアントはユーザーが入力した文字列を処理のためにサーバーに送信し、表示サーバーから返されたタイムスタンプ付きの文字列を受信します。

クライアントプログラムとサーバープログラムを実行します

以下はクライアントの入力と出力です

[root@pythontab]# python client.py 
>>> hello python
[Thu Sep 15 22:29:12 2016] b'hello python'
ログイン後にコピー

以下はサーバーの出力です

[root@pythontab]# python server.py 
waiting for connection...
...connected from: ('127.0.0.1', 55378)
ログイン後にコピー

3.ソケットサーバーモジュール

ソケットサーバーは、標準ライブラリ。ネットワーク クライアントとサーバーの実装に必要な大量の定型コードを簡素化するために使用されます。使用できるいくつかのクラスはモジュールに実装されています。

例 1: ソケットサーバーを使用して、上記のソケット() の例と同じ機能を実現します

服务端程序代码

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import socketserver
import time
 
HOST = '127.0.0.1'
PORT = 8009
ADDR = (HOST,PORT)
BUF_SIZE = 1024
 
class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            print("...connected from:",self.client_address)
            data = self.request.recv(BUF_SIZE)
            if not data:break
            self.request.send(bytes("%s %s"%(time.ctime(),data)))
 
server = socketserver.ThreadingTCPServer(ADDR,Myserver)
print("waiting for connection...")
server.serve_forever()
ログイン後にコピー

11~17行

主要的工作在这里。从socketserver的BaseRequestHandler类中派生出一个子类,并重写handle()函数。

在有客户端发进来的消息的时候,handle()函数就会被调用。

19~21行

代码的最后一部分用给定的IP地址和端口加上自定义处理请求的类(Myserver)。然后进入等待客户端请求与处理客户端请求的无限循环中。

客户端程序代码

import socket
HOST = '127.0.0.1'
PORT = 8009
ADDR = (HOST,PORT)
BUF_SIZE = 1024
 
client = socket.socket()
client.connect(ADDR)
 
while True:
    data = input(">>> ")
    if not data:continue
    client.send(bytes(data,encoding='utf-8'))
    recv_data = client.recv(BUF_SIZE)
    if not recv_data:break
    print(recv_data.decode())
 
client.close()
ログイン後にコピー

执行服务端和客户端代码  

下面是客户端输出

[root@pythontab]# python socketclient.py 
>>> hello python
Thu Sep 15 23:53:31 2016 b'hello python'
>>> hello pythontab
Thu Sep 15 23:53:49 2016 b'hello pythontab'
ログイン後にコピー

下面是服务端输出

[root@pythontab]# python socketserver.py 
waiting for connection...
...connected from: ('127.0.0.1', 55385)
...connected from: ('127.0.0.1', 55385)
...connected from: ('127.0.0.1', 55385)
...connected from: ('127.0.0.1', 55385)
ログイン後にコピー

以上がPythonのソケットモジュールの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート