이번에는 클라이언트가 특정 단어를 입력하기 전까지 계속해서 데이터를 보낼 수 있는 코드를 짜보았습니다.



server.py


# -*- coding: utf-8 -*-

import SocketServer


def quit_server(client_addr):
    print("{} was gone".format(client_addr))


class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        """
        클라이언트와 연결될 때 호출되는 함수
        상위 클래스에는 handle() 메서드가 정의되어 있지 않기 때문에
        여기서 오버라이딩을 해야함
        """
        self.recv_data = ''

        while True:
            try:
                self.recv_data = self.request.recv(1024).strip()

                # :/quit 를 입력하면 루프를 종료
                if self.recv_data == ":/quit":
                    quit_server(self.client_address[0])
                    break

            except NameError as e:
                print "{0} got an error : {1}".format(self.client_address[0], e)

            finally:
                print "{} wrote:".format(self.client_address[0]),
                print self.recv_data

                # 영어의 소문자 데이터를 receive 하면 대문자로 변환해 send
                self.request.sendall(self.recv_data.upper())


if __name__ == "__main__":
    HOST, PORT = "localhost", 3000

    # 서버를 생성합니다. 호스트는 localhost, 포트 번호는 3000
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

    print("waiting for connection...")

    # Ctrl - C 로 종료하기 전까지는 서버는 멈추지 않고 작동
    server.serve_forever()



clinet.py


# -*- coding: utf-8 -*-

import socket

HOST, PORT = "localhost", 3000
# data = "This will be nickname"  # 실제 서비스에는 닉네임을 전송하자
data = ''

# 소켓을 생성 (SOCK_STREAM 은 TCP 소켓을 의미)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

# input 값이 :/quit 일 때까지 데이터 입력 및 전송 반복
# :/quit 를 입력하면 socket 종료
while data != ":/quit":
    data = raw_input("Input : ")
    try:
        # 서버에 연결하고 데이터를 전송
        sock.sendall(data + "\n")

        # 데이터를 수신하고 소켓 연결을 닫음
        received = sock.recv(1024)
    finally:
        print "Sent:     {}".format(data)
        print "Received: {}".format(received)

sock.close()



다음에는 멀티쓰레드를 이용하여 한 서버에 여러 클라이언트가 접속할 수 있도록 하는 코드를 올리겠습니다.

블로그 이미지

NCookie

,