予備のPythonソケット(ソケット)通信

基盤となるネットワークインターフェイスソケットは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送信されるコンテンツはバイナリコードであるため、 encodesumによって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_ISOTPCAN_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でファイルを送信し、sendWindowsでも同じように、使用できないのと同じです。
  • 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) flagfalseノンブロッキング、それ以外の場合はブロッキング
getpeername() ソケットが接続されているリモートアドレスを取得します
getsockname() ソケットローカルアドレスを取得する
gettimeout() settimeout(value) タイムアウト秒

ソケットを中止または閉じるには、いくつかの方法があります

  • close()ソケットのファイル記述子を閉じます
  • detach()ソケットオブジェクトを閉じますが、ファイル記述子は閉じません

shutdown(how)howソケットへの接続は部分的に閉じることができます。

  • SHUT_RD:その後の受信はできなくなりました
  • SHUT_WR:その後の送信は許可されなくなりました
  • SHUT_RDWR:その後の送受信はできません

おすすめ

転載: blog.csdn.net/m0_37816922/article/details/122419972