소켓통신

jinkyung·2021년 3월 12일
0

Python

목록 보기
14/19
post-custom-banner

상대방이 접속 끊을 경우 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()      # 멀티스레드 서버 가동 시작
    
    
post-custom-banner

0개의 댓글