高度なPythonの(X):ネットワークプログラミング

1.はじめに

ネットワークプログラミングは、送信終了情報の主な仕事は、プロトコルパケットに応じて受信端で、指定されたプロトコル・パケットによってアセンブルされ、最終的に通信の目的を達成するために、対応する抽出情報を解析します。トランスポートプロトコルであるTCPとUDPは、TCP接続は信頼性の高いバイトストリームベースのプロトコルは、通常、IPプロトコルと一緒に使用され、必要とされ、UDPはコネクション、信頼性が低いが、より速くを確立する必要はありません。

ネットワークは、アプリケーションがデータを送信または受信することができ、それを通して、重要な概念のソケット(ソケット)でプログラム、アプリケーションはネットワークへのソケットI / Oを可能にし、ネットワーク内の他のアプリケーションと通信します。

Pythonのソケットモジュールは、次の2つが用意されています。

  • ソケットは
    、標準的なBSDソケットAPI、すべての基礎となるオペレーティングシステムのメソッドソケットインタフェースへのアクセスを提供します。

  • SocketServerは、
    サーバークラスのセンターを提供し、ネットワークサーバーの開発を簡素化することができます。

2.

2.1 APIの紹介

Pythonはソケット()関数は、次の形式によってソケットを作成することを目的とします。

socket.socket(家族= AF_INET、タイプ= SOCK_STREAM、プロト= 0、FILENO =なし)

  • ファミリー:ソケット芳香族、AF_INET(サーバ間のネットワーク通信)、(唯一のプロセス間通信システム、シングルUNIXの場合)AF_UNIXを使用することができます

  • タイプ:ソケットタイプは、SOCK_DGRAM(未接続)、SOCK_STREAM(コネクション型)を使用することができます

サーバーソケットオブジェクトのメソッド:

方法 説明
バインド(アドレス) アドレスにバインドされたソケットは、AF_INETの形でアドレスタプル(ホスト、ポート)を示します
聞く([バックログ]) 着信TCP接続の待機を開始し、バックログが接続を拒否する前に、指定された、少なくとも1接続の最大数を一時停止することができますオペレーティングシステムは、ほとんどのアプリケーションでは、5にできるようになります
受け入れます() そして、TCP接続(CONN、アドレス)、CONNソケットオブジェクトが新しいを受け入れるように戻った、送信データを受信するために使用することができ、アドレスは、クライアントのアドレスが接続されています

クライアントソケットオブジェクトのメソッド:

方法 説明
接続(アドレス) 接続エラー場合、ソケットのアドレス、タプル(ホスト名、ポート)のための一般的なフォーマットに接続され、エラー復帰socket.errorが
connect_ex(アドレス) 機能の接続(アドレス)同じですが、成功を返す0、そうでない場合はerrnoの値を返します。

Socketオブジェクトのパブリックメソッド:

方法 説明
RECV(BUFSIZE [、フラグ]) TCPソケットデータは、データがBUFSIZEを受信するデータの最大量を指定し、文字列として返され、フラグが受諾のメッセージに関する追加情報を提供し、通常無視することができ
送信(バイト[、フラグ]) TCPデータ伝送、送信データ列がソケットに接続され、戻り値は、送信されるバイトの数であり、数値、文字列のバイトでのサイズよりも小さくてもよいです
sendall(バイト[、フラグ]) データ列がソケットに接続されている送信しますが、返す前に、すべてのデータを送信しようとし、成功したリターンなし、失敗例外がスローされない、完全なTCPの送信データ
recvfrom(BUFSIZE [、フラグ]) UDPはRECV()に類似したデータを、受信ソケットが、データが文字列データを含む受信された戻り値(データ、アドレス)は、ソケットアドレスは、送信データのアドレスであります
sendto(バイト、フラグ、アドレス) UDPデータ伝送は、ソケットへのデータタプルは、リモートアドレスを指定されたアドレス(ipaddrは、ポート)のフォームを送信し、戻り値が送信されたバイトの数であります
閉じる() ソケットを閉じ
getpeername() 接続ソケットのリモートアドレス、典型的には、タプルタイプに戻る(IPADDR、ポート)
getsockname() 戻り値ソケット自身のアドレス、通常のタプル(IPADDR、ポート)
setsockopt(レベル、OPTNAME、値) 与えられたソケットオプションの値を設定します
getsockopt(レベル、OPTNAME [、buflenは]) ソケットオプションの戻り値
setTimeout(値) ソケットは、秒単位での操作のタイムアウトを設定します
gettimeout() 現在のタイムアウトを返します。
FILENO() ソケットファイルディスクリプタを返します。
setblocking(フラグ) フラグが0である場合は、ソケットが非ブロックモードは、モード(デフォルト値)をブロックするそれ以外のソケットに設定されている、あなたは(RECVを呼び出す場合)、非ブロックモード任意のデータまたは送信()の呼び出しをすることはできません見つけることができませんでしたすぐに異常socket.errorがの原因となり、データを送信します
メイクファイル() でも、ソケットに関連付けられたファイルを作成します。

2.2 TCPモード

私たちは、TCPソケットを経由して通信する方法を見て。

サーバーの基本的な考え方:

  • IPおよびポートにソケットをバインドソケットを作成します。

  • 接続のためにリスニング

  • クライアントからの接続要求を受け入れるように続けます

  • 要求されたデータを受信し、他の応答データを送信

  • 送信が完了すると、ソケットが閉じられています

以下を達成するために特定のコード:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
# 监听连接
s.listen(5)
while True:
    print('等待客户端发送信息...')
    # 接收连接
    sock, addr = s.accept()
    # 接收请求数据
    data = sock.recv(1024).decode('utf-8')
    print('服务端接收请求数据:' + data)
    # 发送响应数据
    sock.sendall(data.upper().encode('utf-8'))
    # 关闭
    sock.close()

クライアントの基本的な考え方:

  • ソケットを作成し、サーバーに接続

  • 変速機を接続した後、データを受信し

  • 送信が完了すると、ソケットが閉じられています

以下を達成するために特定のコード:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 6666))
# 向服务端发送数据
s.sendall(b'hello')
# 接受服务端响应数据
data = s.recv(1024)
print('客户端接收响应数据:' + data.decode('utf-8'))
# 关闭
s.close()

私達はちょうどコードは、クライアントを実行することができ、サーバー側のコードを実行する必要があります。

2.3 UDPモード

私たちは、UDPソケット経由の方法で通信する方法を見てみましょう。

サーバーの基本的な考え方:

  • IPおよびポートにソケットをバインドソケットを作成します。

  • クライアントの要求を受けたデータ

  • クライアント端末に応答データを送信します

以下を達成するために特定のコード:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
while True:
    # 接收数据
    data, addr = s.recvfrom(1024)
    print('服务端接收请求数据:' + data.decode('utf-8'))
    # 响应数据
    s.sendto(data.decode('utf-8').upper().encode('utf-8'), addr)

クライアントの基本的な考え方:

  • ソケットを作成します。

  • サーバにデータを送ります

  • サーバーの応答データを受信

以下を達成するために特定のコード:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 向服务端发送数据
s.sendto(b'hello', ('127.0.0.1', 6666))
# 接受服务端响应数据
data = s.recv(1024).decode('utf-8')
print('客户端接收响应数据:' + data)
# 关闭
s.close()

同様に、我々は、サーバー側のコードを実行し、クライアントコードを実行します。


公開された64元の記事 ウォンの賞賛1276 ビュー30万+

おすすめ

転載: blog.csdn.net/ityard/article/details/104661342