ホームページ  >  記事  >  バックエンド開発  >  Pythonネットワークプログラミング

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

高洛峰
高洛峰オリジナル
2016-11-01 13:18:381691ブラウズ

ソケットを理解する

ソケットは一般に「ソケット」とも呼ばれ、IP アドレスとポートを記述するために使用されます。これは、通常、アプリケーションが「ソケット」を通じてネットワークにリクエストを送信したり、ネットワークリクエストに応答したりするために使用されます。

Socket は Unix に由来しており、Unix/Linux の基本理念の 1 つは「すべてはファイルである」です。 ファイルの場合は、[開く] [読み書き] [閉じる] モードを使用して操作します。ソケットは、このモードの実装です。ソケットは、そのファイルに対する操作 (読み取り/書き込み IO、オープン、クローズ) です:

ファイル モジュールは [開く] [読み取り] です。指定したファイルを [開く] [読み書きする] [閉じる]

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

ython (バージョン 3.5 )最も単純なソケット通信を実現します

#!/usr/bin/env python
# coding=utf-8
# Author:Majh

import socket

ip_port = ('127.0.0.1', 9999)
sk = socket.socket()

sk.connect(ip_port)
send_data = input('>>').strip()
sk.send(bytes(send_data, encoding='utf-8'))
recv_data = sk.recv(1024)
print(str(recv_data, encoding='utf-8'))
sk.close()

客户端代码
#!/usr/bin/env python
# coding=utf-8
# Author:Majh

import socket

sk = socket.socket()
ip_port = ('127.0.0.1', 9999)

sk.bind(ip_port)
print('sk.bind......')
sk.listen(5)
print('sk.listen......')
conn, addr = sk.accept()
print('conn:', conn)
print('addr:', addr)

read_data = conn.recv(1024)
print('read_data', read_data)
read_data = read_data.upper()

conn.send(read_data)
conn.close()

服务器端代码

socketキーワードパラメータ:

sk =ソケット.socket(socket.AF_INET,socket.SOCK_STREAM,0)

パラメータ1:アドレスクラスタ

socket.AF_INET IPv4 (デフォルト)

socket.AF_INET6 IPv6

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


パラメータ2: Type

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

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

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

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

パラメータ3: Protocol

0(デフォルト) 特定のアドレスファミリーに関連するプロトコルは、アドレス形式とソケットカテゴリAに基づいてシステムが自動的に選択します。適切なプロトコル

sk.bind(address)

s.bind(address)はソケットをアドレスにバインドします。アドレスの形式はアドレス ファミリによって異なります。 AF_INET では、アドレスはタプル (ホスト、ポート) の形式で表現されます。

sk.listen(backlog)

着信接続のリスニングを開始します。バックログは、接続が拒否されるまでに保留状態にできる接続の最大数を指定します。

バックログは 5 に等しく、カーネルが接続リクエストを受信したが、サーバーがまだ処理のために accept を呼び出していないことを示します。接続の最大数は 5 です。カーネル内で接続キューを維持する必要があるため、この値を無限にすることはできません。

sk.setblocking( bool)

ブロックするかどうか(デフォルトはTrue)、Falseに設定した場合、acceptとrecv中にデータがない場合にエラーが報告されます。

sk.accept()

接続を受け入れて (conn, address) を返します。conn はデータの送受信に使用できる新しいソケット オブジェクトです。 address はクライアントに接続するためのアドレスです。

TCPクライアントからの接続を受信(ブロッキング)し、接続が到着するのを待ちます

sk.connect(address)

アドレスのソケットに接続します。通常、アドレスの形式はタプル (ホスト名、ポート) です。接続エラーが発生すると、socket.error エラーが返されます。

sk.connect_ex(address)

戻り値があること以外は上記と同じで、接続が成功した場合は0が返され、接続が失敗した場合はコードが返されます。例: 10061

sk.close ()

ソケットを閉じる

sk .recv(bufsize[,flag])

ソケットデータを受け取ります。データは文字列として返され、bufsize は受信できる最大数を指定します。 flag はメッセージに関する追加情報を提供しますが、通常は無視できます。

sk.recvfrom(bufsize[.flag])

recv()と似ていますが、戻り値は(データ,アドレス)です。ここで、data は受信したデータを含む文字列で、address はデータの送信先のソケット アドレスです。

sk.send(string[,flag])

接続されたソケットに文字列のデータを送信します。戻り値は送信するバイト数ですが、文字列のバイト サイズよりも小さい場合があります。つまり、指定されたすべてのコンテンツが送信されるわけではありません。

sk.sendall(string[,flag])

文字列内のデータを接続されたソケットに送信しますが、戻る前にすべてのデータを送信しようとします。成功した場合は None を返し、失敗した場合は例外をスローします。

内部的には、すべてのコンテンツは send を再帰的に呼び出すことによって送信されます。

sk.sendto(string[,flag],address)

ソケットにデータを送信します。アドレスは(ipaddr, port)の形式のタプルで、リモートアドレスを指定します。戻り値は送信されたバイト数です。この機能は主に UDP プロトコルで使用されます。

sk.settimeout(timeout)

ソケット操作のタイムアウト期間を秒単位の浮動小数点数で設定します。値「なし」は、タイムアウト期間がないことを意味します。一般に、タイムアウト期間は接続操作 (最大 5 秒待機するクライアント接続など) に使用される可能性があるため、ソケットが最初に作成されるときに設定する必要があります

sk.getpeername()

接続されたソケットのリモート アドレスを返します。戻り値は通常、タプル (ipaddr、port) です。

sk.getsockname()

ソケット自身のアドレスを返します。通常はタプル (ipaddr,port) です


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。