상대방이 접속 끊을 경우 except로
echoserver
from socket import *
serversock = socket(AF_INET, SOCK_STREAM) # ipv4주소, tcp 소켓 생성
serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 재실행시 바로 port할당
serversock.bind(('localhost', 9000)) # 서버의 ip, port
serversock.listen(100) # 클라이언트 동시 접속시 Queue에 대기
while True:
print("접속 대기중...")
connsock, connaddr = serversock.accept() # 클라이언트와 연결
print("{} 접속".format(connaddr))
while True:
try:
s = connsock.recv(1024).decode("utf-8") # 대기하다고 문자열 수신
connsock.send(s.encode()) # 바로 재전송
print("수신 : " + s) # 화면 출력
if s=="": # 정상종료
connsock.close()
print("{} 접속 종료".format(connaddr))
break;
except:
connsock.close() # 통신 중 컴퓨터가 꺼지거나, 갑자기 종료됨
print("{} Suddenly 접속 종료".format(connaddr))
break
echoclient
from socket import *
clientsock = socket(AF_INET, SOCK_STREAM) # ipv4, tcp 소켓 생성
clientsock.connect(('localhost', 9000)) # 서버로 접속
while True:
str = input("전송할 문자열 입력 : ") # 화면에서 입력
if str == "<stop>": # <stop> 입력시 클라이언트 종료
break
clientsock.send(str.encode()) # 서버로 문자열 전송
s = clientsock.recv(1024).decode("utf-8")
print("서버로부터 수신 : ", s)
clientsock.close()
client를 중지시킬 시 갑자기 종료에 해당
client에서 <stop>
입력시 정상종료
MultithreadServer
import socket
from socketserver import ThreadingTCPServer, StreamRequestHandler
PORT = 9000
class RequestHandler(StreamRequestHandler):
def handle(self):
print("Connection From ", self.client_address)
conn = self.request
while True:
msg = conn.recv(1024).decode("utf-8")
if msg == "":
conn.close()
print("{} 정상 접속 종료".format(self.client_address))
break
conn.send(msg.encode())
print("수신 : ", msg)
if __name__ == '__main__':
# 현재 이 프로그램이 동작하는 ip를 자동 적용, 9000포트
# 클라이언트 접속시 RequestHandler 클래스가 처리하겠다
server = ThreadingTCPServer(('', PORT), RequestHandler)
print("서버 시작", PORT)
server.serve_forever() # 멀티스레드 서버 가동 시작