Socketソケット


Socketとは
Socketは「ソケット」とも呼ばれ、アプリケーションは通常「ソケット」を通じてネットワークに要求を発行したり、ネットワーク要求に応答したりします.ソケット間の接続プロセスは、サーバリスニング、クライアントリクエスト、接続確認の3つのステップに分けられます.Socketはクライアント/サーバモデル向けに設計され、クライアントとサーバプログラムに対して異なるSocketシステム呼び出しを提供する.お客様はランダムにSocketを申請し、システムはSocket番号を割り当てます.サーバにはグローバルに公認されたSocketがあり、どのお客様も接続要求と情報要求を発行することができます(呼び出された電話が呼び出し元が知っている電話番号を持っていることに相当します).
PythonのSocket
Pythonは2つのレベルのアクセスを提供しています.
  • 低レベルのネットワークサービスは基本的なSocketをサポートし、標準的なBSD Sockets APIを提供し、最下位のオペレーティングシステムSocketインタフェースにアクセスできるすべての方法を提供します.
  • 高レベルのネットワークサービスモジュールSocketServerは、サーバセンタークラスを提供し、ネットワークサーバの開発を簡素化します.

  • pythonではimport socketでsocketモジュールをインポートし、socket()関数でソケットを作成します.構文フォーマットは次のとおりです.
    socket.socket([family[, type[, proto]]])
    ——family:         AF_UNIX  AF_INET
    ——type:                       SOCK_STREAM SOCK_DGRAM
    ——protocol:        0.
    

    Socketオブジェクトのメソッドのリスト:
    サービス側のソケットオブジェクトメソッド
    メソッド名
    説明
    s.bind()
    バインドアドレス(host,port)をソケットに、AF_INETでは、**メタグループ(ip,port)**としてアドレスを表す.
    s.listen()
    TCPリスニングを開始します.backlogは、接続を拒否する前にオペレーティングシステムが停止できる最大接続数を指定します.この値は少なくとも1で、ほとんどのアプリケーションは5にすればいいです.
    s.accept()
    TCPクライアント接続を受動的に受け入れ、接続の到来を待つ
    クライアントのソケットオブジェクトメソッド
    メソッド名
    説明
    s.connect()
    TCPサーバ接続をアクティブに初期化し、一般的にaddressのフォーマットはメタグループ(ip,port)であり、接続エラーが発生するとsocketを返す.エラーエラー.
    s.connect_ex()
    connect()関数の拡張バージョンでは、エラー時にエラーコードを返し、例外を投げ出すのではなく
    共通のソケットオブジェクトメソッド
    メソッド名
    説明
    s.recv()
    TCPデータを受信し、データは文字列で返され、bufsizeは受信する最大データ量を指定します.flagは、通常無視できるメッセージに関する他の情報を提供します.
    s.send()
    TCPデータを送信し、stringのデータを接続されたソケットに送信します.戻り値は、stringのバイトサイズよりも小さい送信するバイト数です.
    s.sendall()
    TCPデータを完全に送信し、TCPデータを完全に送信します.stringのデータを接続されたソケットに送信しますが、戻る前にすべてのデータを送信しようとします.Noneに正常に戻り、失敗すると例外が放出されます.
    s.recvform()
    UDPデータはrecv()と同様に受信されるが、戻り値は(data,address)である.ここでdataは受信データを含む文字列であり、addressは送信データのソケットアドレスである.
    s.sendto()
    UDPデータを送信し、ソケットにデータを送信します.addressは(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)
    ソケット操作のオーバータイムを設定し、timeoutは浮動小数点数であり、単位は秒である.値がNoneの場合は、期間を超えていないことを示します.一般に、接続操作(connect()など)に使用できるため、スーパータイムはソケットを作成したばかりのときに設定する必要があります.
    s.gettimeout()
    現在のタイムアウトの値を秒単位で返し、タイムアウトが設定されていない場合はNoneを返します.
    s.fileno()
    ソケットのファイル記述子を返します.
    s.setblocking(flag)
    flagが0の場合、ソケットを非ブロックモードに設定します.そうでない場合、ソケットをブロックモードに設定します(デフォルト).非ブロックモードでは、呼び出しrecv()がデータを発見していない場合、send()呼び出しが直ちにデータを送信できない場合、socketが発生する.error異常.
    s.makefile()
    ソケットに関連付けられたファイルを作成
    単純なインスタンス
    クライアント実装コード
    import socket
    
    #1.   
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP    ,
    
    #2.  
    phone.connect(('127.0.0.1',8080))
    
    #3. \   
    phone.send('hello'.encode('utf-8')) #    bytes  
    data=phone.recv(1024)
    print('        : ',data)
    
    #4.     
    phone.close()
    

    サービス側実装コード
    import socket
    
    #1.   
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STEAM=>TCP    ,
    print(phone) #         ,       
    
    #2.    
    phone.bind(('127.0.0.1',8080)) #0-65535
    
    #3.  
    phone.listen(5) #           5 
    
    print('start....')
    #4.      
    conn,client_addr=phone.accept() #(          ,     ip       )。conn      ,      
    
    #5. \   
    data=conn.recv(1024) #1024        bytes
    print('       ',data)
    conn.send(data.upper())
    
    #6.     
    conn.close()
    
    #7.  
    phone.close()