TCP 서버 구축

TCP 프로토콜을 통해 클라이언트와 통신하는 서버 구현
#server.py
from socketserver import BaseRequestHandler, TCPServer

class EchoHandler(BaseRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        while True:
            msg = self.request.recv(8192)
            print(msg)
            if not msg:
                break
            self.request.send(msg)

if __name__ == '__main__':
    serv = TCPServer(('', 16888), EchoHandler)
    serv.serve_forever()

#client.py
import time
from socket import socket, AF_INET, SOCK_STREAM

s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 16888))
while True:
    time.sleep(5)
    s.send(b'Hello')
    print(s.recv(8192))
  • 특수한 처리 클래스를 정의하여handle () 방법을 실현하여 클라이언트를 위한 연결 서비스에 사용한다.request 속성은 클라이언트 socket,client_address에 클라이언트 주소가 있습니다.이 서버를 실행합니다.py 서버,client를 실행합니다.py를 열고 다른 Python 프로세스를 열어 이 서버에 연결합니다
  • 기본적으로 이 서버는 단일 라인으로 한 번에 클라이언트만 연결할 수 있습니다.여러 클라이언트를 처리하려면 Forking TCPServer 또는 Threading TCPServer 객체를 초기화할 수 있습니다
  • from socketserver import ThreadingTCPServer
    
    if __name__ == '__main__':
        serv = ThreadingTCPServer(('', 20000), EchoHandler)
        serv.serve_forever()
    
  • 라인 탱크도 미리 설치할 수 있다
  • from socketserver import StreamRequestHandler, TCPServer
    
    class EchoHandler(StreamRequestHandler):
        def handle(self):
            print('Got connection from', self.client_address)
            # self.rfile is a file-like object for reading
            for line in self.rfile:
                # self.wfile is a file-like object for writing
                self.wfile.write(line)
    
    if __name__ == '__main__':
        if __name__ == '__main__':
            from threading import Thread
            pool_t = 16
            serv = TCPServer(('', 16888), EchoHandler)
            for n in range(pool_t):
                t = Thread(target=serv.serve_forever)
                t.daemon = True
                t.start()
            serv.serve_forever()
    

    구현 서버 예:

    from socket import socket, AF_INET, SOCK_STREAM
    
    
    def echo_handler(address, client_sock):
        print('Got connection from {}'.format(address))
        while True:
            msg = client_sock.recv(8192)
            if not msg:
                break
            client_sock.sendall(msg)
        client_sock.close()
    
    
    def echo_server(address, backlog=5):
        sock = socket(AF_INET, SOCK_STREAM)
        sock.bind(address)
        sock.listen(backlog)
        while True:
            client_sock, client_addr = sock.accept()
            echo_handler(client_addr, client_sock)
    
    
    if __name__ == '__main__':
        echo_server(('', 16888))
    
    
    import time
    from socket import socket, AF_INET, SOCK_STREAM
    
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(('localhost', 16888))
    while True:
        # time.sleep(5)
        s.send(b'Hello')
        print(s.recv(8192))
    
    
    

    좋은 웹페이지 즐겨찾기