이번에는 클라이언트가 특정 단어를 입력하기 전까지 계속해서 데이터를 보낼 수 있는 코드를 짜보았습니다.
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# -*- 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- 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()
다음에는 멀티쓰레드를 이용하여 한 서버에 여러 클라이언트가 접속할 수 있도록 하는 코드를 올리겠습니다.
'파이썬' 카테고리의 다른 글
[파이썬] 문자열 포맷팅(fomatting) % vs .format() (0) | 2016.12.17 |
---|---|
[파이썬] socketserver 모듈을 이용하여 채팅 프로그램 만들기(3) (0) | 2016.12.07 |
[파이썬] socketserver 모듈을 이용하여 채팅 프로그램 만들기(1) (0) | 2016.12.04 |
[파이썬] 여러 개의 정수를 공백 단위로 입력받기 (0) | 2016.11.30 |
[파이썬] 클로저 (0) | 2016.11.23 |