Pythonネットワークプログラミング


Python は、ネットワーク サービスへの 2 つのレベルのアクセスを提供します。 :

  • 低レベルのネットワーク サービスは、標準の BSD ソケット API を提供し、基礎となるオペレーティング システムのソケット インターフェイスのすべてのメソッドにアクセスできる基本的なソケットをサポートします。

  • 高レベルのネットワーク サービス モジュール SocketServer。ネットワーク サーバーの開発を簡素化するサーバー センター クラスを提供します。


ソケットとは何ですか?

ソケットは通常、「ソケット」を通じてネットワークにリクエストを送信したり、ネットワークリクエストに応答したりして、コンピューター上のホストまたはプロセスが相互に通信できるようにします。コミュニケーション。


socket() 関数

Python では、socket() 関数を使用してソケットを作成します。構文形式は次のとおりです:

socket.socket([family[, type[, proto]]])

Parameters

  • family: ソケット ファミリは AF_UNIX または AF_INET

    です。
  • type: ソケットのタイプは次のように分類できます。 SOCK_STREAMSOCK_DGRAM

  • protocol: 通常は空白のままにし、デフォルトは 0 です。

ソケットオブジェクト(組み込み)メソッド

関数説明
サーバー側ソケット
s.bind()バインドアドレス(ホスト、ポート)ソケットへは、AF_INET の下で、タプル (ホスト、ポート) の形式でアドレスを表します。
s.listen() TCP リスニングを開始します。バックログは、オペレーティング システムが接続を拒否するまでに一時停止できる接続の最大数を指定します。この値は少なくとも 1 である必要があり、ほとんどのアプリケーションでは 5 で十分です。
s.accept() TCPクライアント接続を受動的に受け入れ、接続の到着を(ブロックして)待ちます
クライアントソケット
s.connect() TCPサーバー接続をアクティブに初期化します、。通常、アドレスの形式はタプル (ホスト名、ポート) です。接続エラーが発生すると、socket.error エラーが返されます。
s.connect_ex() connect()関数の拡張版で、エラー発生時に例外をスローする代わりにエラーコードを返します
公共目的のソケット関数
s.recv () TCP データを受信します。データは文字列の形式で返されます。bufsize は受信するデータの最大量を指定します。 flag はメッセージに関する追加情報を提供しますが、通常は無視できます。
s.send() TCP データを送信し、文字列内のデータを接続されたソケットに送信します。戻り値は送信するバイト数ですが、文字列のバイト サイズよりも小さい場合があります。
s.sendall() TCPデータを完全に送信、TCPデータを完全に送信します。接続されたソケットにデータを文字列で送信しますが、戻る前にすべてのデータを送信しようとします。成功した場合は None を返し、失敗した場合は例外をスローします。
s.recvform()recv()と同様にUDPデータを受信しますが、戻り値は(データ,アドレス)です。ここで、data は受信したデータを含む文字列で、address はデータの送信先のソケット アドレスです。
s.sendto() UDP データをソケットに送信します。アドレスは (ipaddr, port) 形式のタプルで、リモート アドレスを指定します。戻り値は送信されたバイト数です。
s.close()ソケットをクローズします
s.getpeername()接続されているソケットのリモートアドレスを返します。戻り値は通常、タプル (ipaddr、port) です。
s.getsockname()ソケット自身のアドレスを返します。通常は (ipaddr, port) のタプルです。
s.setsockopt(level, optname, value) 指定されたソケット オプションの値を設定します。
s.getsockopt(level,optname[.buflen])ソケットオプションの値を返します。
s.settimeout(timeout) ソケット操作のタイムアウト期間を秒単位の浮動小数点数で設定します。値「なし」は、タイムアウト期間がないことを意味します。一般に、タイムアウト期間は接続操作 (connect() など) に使用される可能性があるため、ソケットが最初に作成されるときに設定する必要があります。
s.gettimeout() 現在のタイムアウト期間の値を返します。秒単位。タイムアウト期間が設定されていない場合は、None が返されます。
s.fileno()ソケットのファイル記述子を返します。
s.setblocking(flag) flag が 0 の場合、ソケットを非ブロッキング モードに設定し、それ以外の場合、ソケットをブロッキング モード (デフォルト値) に設定します。ノンブロッキング モードでは、recv() 呼び出しでデータが見つからない場合、または send() 呼び出しでデータをすぐに送信できない場合、socket.error 例外が発生します。
s.makefile()ソケットに関連付けられたファイルを作成します

簡単な例

server

ソケットモジュールのsocket関数を使用してソケットオブジェクトを作成します。ソケット オブジェクトは、他の関数を呼び出すことによってソケット サービスをセットアップできます。

これで、bind(hostname, port)関数を呼び出すことでサービスのport(port)を指定できるようになりました。

次に、ソケットオブジェクトのacceptメソッドを呼び出します。このメソッドは、クライアントの接続を待機し、クライアントに接続されていることを示す connection オブジェクトを返します。

完全なコードは次のとおりです:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口
s.bind((host, port))        # 绑定端口

s.listen(5)                 # 等待客户端连接
while True:
    c, addr = s.accept()     # 建立客户端连接。
    print '连接地址:', addr
    c.send('欢迎访问php中文网!')
    c.close()                # 关闭连接

Client

次に、上で作成したサービスに接続するための単純なクライアント インスタンスを作成します。ポート番号は 12345 です。

socket.connect(hosname, port) メソッドは、ホストがhostname、ポートがportであるサービスプロバイダーへの TCP 接続を開きます。接続後、サーバーからデータを送信できます。操作が完了したら接続を閉じる必要があることに注意してください。

完全なコードは次のとおりです:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:client.py

import socket               # 导入 socket 模块

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口好

s.connect((host, port))
print s.recv(1024)
s.close()

次に、2 つのターミナルを開きます。最初のターミナルは、server.py ファイルを実行します:

$ python server.py

2 番目のターミナルは、client.py ファイルを実行します:

$ python client.py 
欢迎访问php中文网!

最初のターミナルでは、次の情報出力が表示されます:

连接地址: ('192.168.0.118', 62461)

Python インターネット モジュール

以下は、Python ネットワーク プログラミングのいくつかの重要なモジュールのリストです:

プロトコル機能と使用ポート番号Pythonモジュール
HTTPWebアクセス80httplib、urllib、xmlrpclib
NNTP一般に「投稿」として知られるニュース記事の読み取りと投稿119nntplib
FTP ファイル転送20ftplib、urllib
SMTPメール送信25smtplib
POP3メール受信 110 poplib
IMAP4Getメール 143imaplib
Telnetコマンドライン23telnetlib
Gopher情報検索70 gopherlib、urllib

詳細については、を参照してください。公式 Web サイトの「ソケット ライブラリとモジュール」で Python にアクセスします。