socketserverによるsocketプログラミングの簡素化

3026 ワード

tcpのsocketマルチスレッド通信を実現


1. What is socketserver?


socketは多く同時ではなく、1人のユーザーしかサポートできません.socketserverはネットワークサービスプログラムを作成するタスクを簡素化し、socketserverはsocketのパッケージです.socketserverはpython 2でSocketServer、python 3で頭文字の大文字をキャンセルしsocketserverと名前を変更します.socketserverには、サービスクラス(server class)、リクエスト処理クラス(request handle class)の2種類が含まれています.前者は、バインド、リスニング、実行......(つまり、接続を確立するプロセス)のような多くの方法を提供し、後者は、ユーザーが送信したデータ(つまり、トランザクションロジック)をどのように処理するかに集中します.一般的に、すべてのサービスは、まず接続を確立し、すなわちサービスクラスのインスタンスを確立し、その後、ユーザ要求の処理を開始し、すなわち要求処理クラスのインスタンスを確立する.

2. what types?


class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True) class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True) class socketserver.UnixStreamServer(server_address,RequestHandlerClass,bind_and_activate=True) class socketserver.UnixDatagramServer(server_address,RequestHandlerClass,bind_and_activate=True)

3. How use socketserver?


1). 要求処理のクラスを作成し、このクラスはBaseRequestHandlerclassを継承し、親クラスのhandle()メソッドを書き換えます.2). TCPServerをインスタンス化し、server IPと上で作成したリクエスト処理クラスをこのTCPServerに渡す必要があります.3). server.handle_リクエスト()は1つのリクエストのみを処理します.server.server_forever()は複数のリクエストを処理し、永遠に4)を実行する.接続を閉じるserver_close()
server :
import socketserver
from socketserver import BaseRequestHandler
BUFFERSIZE=1024*2

class MyTcpHandle(BaseRequestHandler):

    def handle(self):
        # the request as self.request  ==== clientSock
        # client address as self.client_address
        # the server  as self.server
        while True:
            #  ;
            self.data=self.request.recv(BUFFERSIZE)
            print('{0}   {1}'.format(self.client_address,self.data))
            self.request.send(self.data.upper())

if __name__ == '__main__':
    HOST='172.25.254.67'
    PORT=5003
    server=socketserver.ThreadingTCPServer((HOST,PORT),MyTcpHandle)
    server.serve_forever()
client :( )
import socket

# 1.  socket ;
# family IP : IPV4:AF_INET;  ipv6: AF_INET6
# type :TCP(SOCKET.SOCK_STREAM), UDP(SOCK_DGRAM)
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 2.  (ip, port)
client.connect(('172.25.254.67', 5003))
while True:
    # 3.  , send(self, data: **bytes***, flags: int = ...) -> int: ...
    sendData = input('client:>> ')
    if not sendData:
        continue
    if sendData == 'quit':
        print(" .....")
        break

    client.send(sendData.encode('utf-8'))

    # 4.  
    recvData = client.recv(1024)
    print(" :", recvData.decode('utf-8'))

# 7.  socket 
client.close()

表示結果:server:(‘172.2 5.254.67’,49540)伝達データb’hello’(‘172.2 5.254.67’,49540)伝達データb’nice to meet you’(‘172.2 5.254.67’,49541)伝達データb’yes so small’
Client:client:>>helloクライアント受信メッセージ:HELLO client:>>nice to meet youクライアント受信メッセージ:NICE TO MEET YOU
Client 1:client:>>yes so smallクライアント受信メッセージ:YES SO SMALL