Python은 SocketServer 모듈을 사용하여 기본 서버 프로그램의 자습서를 작성합니다.
서버를 작성하려면우선, 요청 처리 클래스를 만들어야 합니다. 이것은 BaseRequestHandler의 하위 클래스이고handle () 방법을 다시 불러옵니다.그 다음에 서버 클래스, 서버에 전송된 주소와 요청 처리 프로그램 클래스를 실례화해야 합니다.마지막으로 handle_ 호출request () (일반적으로 다른 이벤트 순환을 호출하거나 select () 또는 serve_forever().
ThreadingMixIn 클래스를 통합할 때 예외 종료를 처리해야 합니다.daemon_threads는 서버가 라인이 끝날 때까지 기다릴지 여부를 표시합니다. 라인이 서로 독립적이면 True로 설정해야 합니다. 기본값은 False입니다.
어떤 네트워크 프로토콜을 사용하든지 서버 클래스는 같은 외부 방법과 속성을 가지고 있다.
Python3에서 이 모듈은 socketserver 모듈입니다.Python 2에서 이 모듈은 SocketServer 모듈입니다.따라서 import로 가져올 때 상황을 나누어 가져와야 합니다. 그렇지 않으면 오류가 발생합니다.가져온 코드는 다음과 같습니다.
try:
import socketserver #Python 3
except ImportError:
import SocketServer #Python 2
SocketSerror 모듈에는 TCP, UDP, UNIX 도메인 소켓 서버를 단순화할 수 있는 많은 클래스가 포함되어 있습니다.
1. 프로세서가 이 모듈을 사용하려면 기본 클래스인 BaseRequestHandler에 계승된 프로세서 클래스를 정의해야 합니다.BaseRequestHandler 클래스의 실례 h는 다음과 같은 방법을 실현할 수 있습니다. 1. h.handle () 은 이 방법을 호출하여 실제 요청 작업을 실행합니다.이 함수를 호출하면 어떤 매개 변수도 가지고 있지 않지만, 몇 개의 실례 변수는 유용한 값을 포함한다.h.request 요청 포함, h.client_address는 클라이언트 주소를 포함하고 h.server는 호출 처리 프로그램의 실례를 포함합니다.TCP 같은 데이터 흐름 서비스에 대해 h.request 속성은 소켓 대상이다.데이터 보고 서비스의 경우 데이터를 받는 바이트 문자열을 포함합니다.2. h.setup () 이 방법은handle () 전에 호출됩니다.기본적으로 아무 작업도 수행하지 않습니다.서버에서 SSL 연결과 같은 추가 연결 설정을 원한다면 여기에서 실행할 수 있습니다.3. h.finish () 호출 이 방법은 handle () 을 실행한 후에 지우기 작업을 실행할 수 있습니다.기본적으로 아무 작업도 수행하지 않습니다.setup () 과handle () 방법이 이상이 발생하지 않으면 이 방법을 호출할 필요가 없습니다.응용 프로그램이 데이터 흐름에 대한 연결(예를 들어 TCP)만 조종할 수 있다는 것을 알고 있다면, BaseRequestHandler가 아니라 StreamRequestHandler로부터 계승해야 한다.StreamRequestHandler 클래스는 두 가지 속성을 설정합니다. h.wfile은 클라이언트의 클래스 파일 대상, h.rfile는 클라이언트로부터 데이터를 읽는 클래스 파일 대상입니다.패키지 작업에 대한 프로세서를 작성하고 응답을 송신자에게 계속 되돌려주려면 Datagram Request Handler에서 계승해야 합니다.이것은 StramRequestHandler와 같은 클래스 인터페이스를 제공합니다.
2. 서버가 프로세서를 사용하려면 서버 대상에 삽입해야 한다.네 개의 기본 서버 클래스를 정의했습니다.(1) TCPServer(address,handler)는 IPv4의 TCP 프로토콜을 사용하는 서버를 지원하며,address는 (host,port) 모듈입니다.Handler는 BaseRequestHandler 또는 StreamRequestHandler 클래스의 하위 클래스의 실례입니다.(2) UDPserver(address,handler)는 IPv4의 UDP 프로토콜을 사용하는 서버를 지원합니다.address와handler는 TCPServer와 유사합니다.(3) UnixStream Server(address,handler)는 UNIX 도메인 소켓을 사용하여 데이터 흐름 프로토콜을 위한 서버를 실현하고 TCPServer에서 계승한다.(4) UnixDatagram Server(address,handler)는 UNIX 도메인 소켓을 사용하여 데이터 보고 프로토콜을 실현하는 서버로 UDPserver에서 상속됩니다.모든 네 개의 서버 클래스의 실례는 다음과 같은 방법과 변수가 있습니다. 1. s.socket은 요청을 전송하는 플러그인 대상에 사용됩니다.2、s.sever_address 감청 서버의 주소입니다.예를 들어 원조("127.0.0.1", 80)3, s.RequestHandlerClass는 서버 구조 함수에 전달되고 사용자가 제공하는 요청 처리 프로그램 클래스입니다.4、s.serve_forever () 무한 요청 처리 5, s.shutdown () serve_ 중지forever () 순환 6, s.fileno () 는 서버 플러그인의 정수 파일 설명자를 되돌려줍니다.이 방법은 서버 실례를 윤문 작업 (예를 들어 select () 함수) 을 통해 효과적으로 사용할 수 있다.
3. 사용자 정의 서버 서버를 정의하려면 서로 다른 네트워크 주소족, 초기, 병발과 다른 기능을 처리하기 위해 특수한 설정을 필요로 한다. 상기 네 가지 기본 서버 클래스를 계승하여 스스로 정의할 수 있다.혼합 클래스를 통해 더 많은 서버 기능을 얻을 수 있으며, 이것도 프로세스나 스레드 분기를 통해 추가하고 발행하는 방법이다.병발성을 실현하기 위해 다음과 같은 종류를 정의했다. (1) Forking MixIn은 유닉스 프로세스 지점을 서버에 추가하는 혼합 방법으로 서버 서비스를 여러 고객에게 제공할 수 있다.(2) Threading MixIn은 여러 클라이언트가 스레드 서비스를 사용할 수 있도록 서버의 혼합 클래스를 수정합니다.서버에 이 기능을 추가하려면 다중 계승을 사용할 수 있습니다. 그 중에서 먼저 혼합된 클래스를 열거합니다.병발 서버가 자주 사용되기 때문에 이를 정의하기 위해 SocketServer는 다음과 같은 서버 클래스를 미리 정의했다. (1) Forking UDPSERver(address,handler) (2) Forking TCPServer(address,handler) (3) Threading UDPSERver(address,handler) (4) Threading TCPServer(address,handler) 위에 약간 혼란스러웠기 때문에 다음과 같다. SocketServer 모듈의 클래스는 주로 다음과 같다. 1.BaseServer는 서버의 핵심 기능과 혼합 클래스(mix-in)의 갈고리 기능을 포함합니다.이 클래스는 주로 파생에 사용되며, 이 클래스의 클래스 대상을 직접 생성하지 말고, TCPServer와 UDPserver 클래스를 사용할 수 있습니다.2. TCPServer 기본 네트워크 동기화 TCP 서버 3, UDPserver 기본 네트워크 동기화 UDP 서버 4, Forking MixIn은 서버 클래스와 혼합(mix-in)하여 비동기적인 기능을 제공하는 핵심 프로세스화 기능을 실현했다.이런 종류의 대상을 직접 생성하지 마라.5. Threading MixIn은 핵심 루틴화 기능을 실현하여 서버 클래스와 혼합(mix-in)하여 비동기적인 기능을 제공한다.이런 종류의 대상을 직접 생성하지 마라.6. Forking TCPServer Forking MixIn과 TCPServer의 조합 7, Forking UDPSERver Forking MixIn과 UDPSERver의 조합 8, Base Request Handler 9, Stream Request Handler TCP 요청 처리 클래스의 실현 10, Data Stream Request Handler UDP 요청 처리 클래스의 실현 현재 번잡한 업무는 모두 클래스에 봉인되어 클래스를 직접 사용하면 된다.
넷째, 실례1.SocketServer 모듈을 사용하여 작성된 TCP 서버 측 코드:
#! /usr/bin/env python
#coding=utf-8
""" SocketServer TCP """
from SocketServer import (TCPServer,StreamRequestHandler as SRH)
from time import ctime
class MyRequestHandler(SRH):
def handle(self):
print "connected from ",self.client_address
self.wfile.write("[%s] %s" %(ctime(),self.rfile.readline()))
tcpSer=TCPServer(("",10001),MyRequestHandler)
print "waiting for connection"
tcpSer.serve_forever()
TCP :
#! /usr/bin/env python
#coding=utf-8
from socket import *
BUFSIZE=1024
#
while True:
tcpClient=socket(AF_INET,SOCK_STREAM)
tcpClient.connect(("localhost",10001))
data=raw_input(">")
if not data:
break
tcpClient.send("%s\r
" %data)
data1=tcpClient.recv(BUFSIZE)
if not data1:
break
print data1.strip()
tcpClient.close()
2. 비동기 서버의 실현
ThreadingMixIn의 예:
import socketimport threadingimport SocketServerclass ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
cur_thread = threading.current_thread()
response = "{}: {}".format(cur_thread.name, data)
self.request.sendall(response)class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
passdef client(ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
try:
sock.sendall(message)
response = sock.recv(1024)
print "Received: {}".format(response)
finally:
sock.close()if __name__ == "__main__":
# Port 0 means to select an arbitrary unused port
HOST, PORT = "localhost", 0
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address # Start a thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
# Exit the server thread when the main thread terminates
server_thread.daemon = True
server_thread.start()
print "Server loop running in thread:", server_thread.name
client(ip, port, "Hello World 1")
client(ip, port, "Hello World 2")
client(ip, port, "Hello World 3")
server.shutdown()
실행 결과:
$ python ThreadedTCPServer.py
Server loop running in thread: Thread-1
Received: Thread-2: Hello World 1
Received: Thread-3: Hello World 2
Received: Thread-4: Hello World 3
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.