記事ディレクトリ
基盤となるネットワークインターフェイスソケットはPython標準ライブラリに組み込まれており、次のコードはすべてデフォルトですfrom socket import *
予備的な理解
socket
ソケットに翻訳すると、批判する人もいますが、かなり適切だと思います。その機能は低レベルのネットワークサービスを提供することであり、最も一般的に使用されるのはIPに基づいてデータを送信することです。
いわゆる送信では、2つの「エンド」が必要です。まず、サーバーである必要があります。
import socket
s = socket.socket()
host = socket.gethostname() #本机地址
port = 12345 #端口
s.bind((host,port)) #绑定端口
s.listen(3) #开始监听,最多支持三个链接
while True:
c, addr = s.accept() #等待连接
print("Linked @ Addr",addr)
break
#下面为发送命令
while True:
data = input("input data:")
c.send(data.encode("utf8"))
if data=="exit":
c.close()
break
send
送信されるコンテンツはバイナリコードであるため、 encode
sumによってdecode
エンコードおよびデコードされることに注意してください。入力した場合は最後にexit
終了します。
次に、クライアントを作成します
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host,port))
while True:
data = s.recv(1024).decode("utf8")
if data!=b'':
print("receive data:", data)
# 当接收到exit时关闭端口,退出循环
if data[:4]=="exit":
s.close()
break
実行後、サーバーとクライアントの入力と出力はそれぞれ
#服务端
Linked @ Addr ('192.168.1.113', 9953)
input data:hello world
11
input data:who are you
11
input data:can u speak chinese?
20
input data:exit
4
#客户端
receive data: hello world
receive data: who are you
receive data: can u speak chinese?
receive data: exit
ソケットオブジェクト
上記の例ではsocket.socket
、オブジェクトはsocket
の完全なコンストラクターで作成されます
socket.socket(family=AF_INET, type=SOCK_STREAM,proto=0,fileno=None)
その中でfamily
、ソケットを表すアドレスファミリには、主に3つのカテゴリが含まれます。
住所家族 | AF_INET |
AF_INET6 |
AF_UNIX |
---|---|---|---|
プロトコルソース | IPv4 | IPv6 | UNIX |
|
シリアルポートを作成する場合、OR演算により複数のアドレスファミリを同時に選択できます。
type
ソケットタイプには、一般的に使用される2つがあります
- ストリーミングソケット用のSOCK_STREAMは、送信と受信の順序が同じであるという特徴があり、安全です。
- SOCK_DGRAM、データグラム形式のソケット、高速で順序付けられていない、損失の可能性があることを特徴とする
protoはプロトコル番号で、通常は0です。プロトコルAF_CAN
ファミリはCAN_RAW
、、、またはCAN_BCM
である必要があります。CAN_ISOTP
CAN_J1939
filenoは、作成されたsocket
ファイルを表します。
コンストラクターはクライアントとサーバーのパラメーターを宣言しませんが、2つが呼び出すことができるメンバーは、機能の点で完全に同じであってはなりません。
その中でbind
、、、、listen
これらaccept
の3つの方法はサーバー独自の方法であり、それらの機能は次のとおりです。
bind(address)
:アドレスにバインドします。アドレスaddress
は通常、IPとポート番号を含むタプルです。listen(N)
:サーバーを起動して、接続N
の最大数である接続を受け入れます。0以上です。accept()
:接続を受け入れ、パラメータはありません。戻り値は(conn, address)
タプルです。これは、データを送受信するためconn
の新しいオブジェクトです。socket
したがって、クライアントには2つの専用メソッドもあります
connect(address)
:アドレスに接続します。connect_ex(address)
:connect
対照的に、エラーが発生した場合は、エラーを報告せずにエラーコードを返します。
次は、クライアントとサーバーの両方で使用できるメソッドです。最も重要なのは、送信send
と受信recv
です。
その中で、送信に関連する機能は次のとおりです。
send(bytes)
:その中にbytes
は送信バイトがあり、送信バイトを返します(完全に送信されない場合もあります)。sendall(bytes)
:send
と比較して、bytes
すべてのデータが送信されるか、エラーが報告されるまで送信を継続します。sendfile(file,offset=0,count=None)
:Unixでファイルを送信し、send
Windowsでも同じように、使用できないのと同じです。sendto(bytes,addresss)
:データを送信するアドレスを指定します。
Windowsで使用できる受信関連関数は2セットありbufsize
、受信データの最大バイト数を表します。
データを返す | 戻りデータ+受信者アドレス | |
---|---|---|
バッファに書き込まないでください | recv(bufsize) |
recvfrom(bufsize) |
書き込みバッファbuf |
recv_into(buf,bufsize) |
recvfrom_into(buf,bufsize) |
get-setは、多くのモジュールに表示される関数名です。前者は特定のパラメーターの取得を表し、後者は特定のパラメーターの設定を表します。通常、後者の入力は前者の出力です。
get |
set |
|
---|---|---|
get_inheritable() |
set_inheritable(i) |
ソケットファイル記述子 |
getblocking() |
setblocking(flag) |
flag false ノンブロッキング、それ以外の場合はブロッキング |
getpeername() |
ソケットが接続されているリモートアドレスを取得します | |
getsockname() |
ソケットローカルアドレスを取得する | |
gettimeout() |
settimeout(value) |
タイムアウト秒 |
ソケットを中止または閉じるには、いくつかの方法があります
close()
ソケットのファイル記述子を閉じますdetach()
ソケットオブジェクトを閉じますが、ファイル記述子は閉じません
shutdown(how)
how
ソケットへの接続は部分的に閉じることができます。
SHUT_RD
:その後の受信はできなくなりましたSHUT_WR
:その後の送信は許可されなくなりましたSHUT_RDWR
:その後の送受信はできません