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
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
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()