Pythonのsocket詳細

7223 ワード

Socketプログラミング
1.基本概念
1.      /     ?
             ,         (     )     “  ”。                 ,
     (    ),        。
           ,               。

2.   :    
             ,          “    ”   。            ,             。
           ,          。

Python   AF_UNIX、AF_NETLINK、AF_TIPC   AF_INET ,         AF_INET.

3.     :  -   
                ,python      :ADDR = (HOST,PORT)。

4.     
     (SOCK_STREAM):        、         。

      (SOCK_DGRAM):           。                ,                    ,             。

2.Pythonネットワークプログラミング
2.1一般的なソケットオブジェクトの方法と属性
名前
説明
サービス側
サーバソケットメソッド
s.bind(ADDR)
アドレス(ホスト名、ポート番号ペア)をソケットにバインド
s.listen([backlog])
TCPリスナーを設定して起動し、backlogを指定する場合は、少なくとも0(0未満の場合は0)に設定する必要があります.
s.accept()
TCPクライアント接続を受動的に受け入れ、接続が到着(ブロック)するまで待つ
クライアント
クライアントソケットメソッド
s.connect()
アクティブにTCPサーバ接続を開始
s.connect_ex()
connect()の拡張バージョンでは、例外を投げ出すのではなく、エラーコードの形式で問題が返されます.
一般通用
一般的なソケットの使い方
s.recv()
TCPメッセージの受信
s.recv_into()
指定されたバッファにTCPメッセージを受信
s.send()
TCPメッセージの送信
s.sendall()
TCPメッセージを完全に送信
s.recvfrom()
UDPメッセージの受信
s.recvfrom_into()
指定されたバッファへのUDPメッセージの受信
s.sendto()
UDPメッセージの送信
s.getpeername()
ソケット(TCP)に接続されたリモートアドレス
s.getsockname()
現在のソケットのアドレス
s.getsockopt()
指定したソケットオプションの値を返します.
s.setsockopt()
指定したソケットオプションの値を設定
s.shutdown()
接続を閉じる
s.close()
クローズソケット
s.detach()
ファイル記述子を閉じずにソケットを閉じ、ファイル記述子に戻る
s.ioctl()
ソケットモードの制御(Windowsのみ)
ブロッキング
ブロック向けソケットメソッド
s.setblocking()
ソケットのブロックまたは非ブロックモードの設定
s.settimeout()
ブロックソケット操作のタイムアウト時間の設定
s.gettimeout()
ブロックソケット操作のタイムアウト時間の取得
ファイルメソッド
ファイル向けソケットの方法
s.fileno()
ソケットのファイル記述子
s.makefile()
ソケットに関連付けられたファイルオブジェクトの作成
ツールバーの
データ属性
s.family
ソケットファミリー
s.type
ソケットタイプ
s.proto
ソケットプロトコル
2.2サービスとクライアントの作成
2.2.1 TCPサービスの作成
一般的な作成プロセス:
ss = socket()       #          
ss.bind(ADDR)       #          
ss.listen()         #      
while True:         #         
cs = ss.accept()    #         
comm_loop:          #      
cs.recv()/cs.send() #    (   /   )
cs.close()          #          
ss.close()          #           # (  )

2.2.2 TCPクライアントの作成
一般的な作成プロセス:
cs = socket()       #          
cs.connect()        #         
comm_loop:          #      
cs.send()/cs.recv() #    (   /   )
cs.close()          #          

2.2.3 UDPサービスの作成
一般的な作成プロセス:
ss = socket()       #          
ss.bind(ADDR)       #          
while True:         #         
ss.sendto()         #     
ss.recvfrom()       #    
ss.close()          #           # (  )

2.2.4 UDPクライアントの作成
一般的な作成プロセス:
cs = socket()       #          
comm_loop:          #      
cs.sendto()         #     
cs.recvfrom()       #    
cs.close()          #          

server.pyコード
import socket
from time import ctime
import json
import time
HOST = ''
PORT = 9001
ADDR = (HOST, PORT)
BUFFSIZE = 1024
MAX_LISTEN = 5


def tcpServer():
    # TCP  
    # with socket.socket() as s:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        #           
        s.bind(ADDR)
        #       
        s.listen(MAX_LISTEN)
        print('      。。。。。。。。。。。。')
        while True:
            #          ,  connSock
            conn, addr = s.accept()
            print('  ,    :{}     !!!'.format(addr))
            with conn:
                while True:
                    print('      。。。。。')
                    #       
                    data = conn.recv(BUFFSIZE)
                    print('data=%s' % data)
                    print('    :{!r}'.format(data.decode('utf-8')))

                    #       
                    conn.send(data.encode('utf-8'))
                    print('      !!!')
            s.close()


#   UDP  
def udpServer():
    #   UPD      
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        #        
        s.bind(ADDR)
        #       
        while True:
            print('UDP    ,      。。。')
            #             
            data, address = s.recvfrom(BUFFSIZE)

            if not data:
                break

            print('      :{}'.format(data.decode('utf-8')))

            s.sendto(b'i am udp,i got it', address)

        s.close()

if __name__ == '__main__':

    while True:
        choice = input('input choice t-tcp or u-udp:')

        if choice != 't' and choice != 'u':
            print('please input t or u,ok?')
            continue

        if choice == 't':
            print('execute tcpsever')
            tcpServer()
        else:
            print('execute udpsever')
            udpServer()

client.pyコード
import socket

from time import ctime
HOST = 'localhost'
PORT = 9001
ADDR = (HOST, PORT)
ENCODING = 'utf-8'
BUFFSIZE = 1024


def tcpClient():
    #        
    with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s:
        #        
        s.connect(ADDR)
        print('      !!')
        #     
        while True:
            inData = input('pleace input something:')
            if inData == 'q':
                break
            #         
            inData = '[{}]:{}'.format(ctime(), inData)

            s.send(inData.encode(ENCODING))
            print('    !')

            #       
            outData = s.recv(BUFFSIZE)
            print('      :{!r}'.format(outData))

        #         
        s.close()


def udpClient():
    #         
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        while True:
            #         
            data = input('please input message to server or input \'quit\':')
            if data == 'quit':
                break
            data = '[{}]:{}'.format(ctime(), data)

            s.sendto(data.encode('utf-8'), ADDR)

            print('send success')

            #          
            recvData, addrs = s.recvfrom(BUFFSIZE)

            print('recv message : {}'.format(recvData.decode('utf-8')))

        #      
        s.close()


if __name__ == '__main__':

    while True:
        choice = input('input choice t-tcp or u-udp or q-quit:')
        if choice == 'q':
            break
        if choice != 't' and choice != 'u':
            print('please input t or u,ok?')
            continue

        if choice == 't':
            print('execute tcpsever')
            tcpClient()
        else:
            print('execute udpsever')
            udpClient()

コードの説明:まずpython server.pyを実行して、python client.pyを実行して、TPC/UDPの簡単な通信をテストすることができます.
転載先:https://www.cnblogs.com/lonelyhiker/p/8577009.html