본문 바로가기

Information Technology

[Python] 간단한 소켓 프로그래밍

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)


echo_server.py

import socket

# 서버에서 소켓을 받을 호스트 주소와 포트 번호를 매개변수로 전달
def run_server(host='127.0.0.1', port=7788):
    BUF_SIZE = 1024
    # Address Family = IPv4 , TCP 통신을 위해 STREAM 소켓 타입
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:	# socket.socket()을 통해 socket 객체를 생성
        sock.bind((host, port))		# socket.bind()에 (IP주소, 튜플) 을 매개변수로 bind. bind를 통해 소켓을 포트에 연결시킴
        sock.listen()				# 서버에서 socket 객체를 listen state로 설정
        conn, addr = sock.accept()	# conn과 addr에 socket 객체가 accept하는 데이터 정보(encoding되어서 옴) 저장
        while True:
            data = conn.recv(BUF_SIZE)	# data에 conn이 BUFF_SIZE만큼 recieve한 encoding된 정보 저장
            msg = data.decode()			# msg에 data의 정보를 decoding해서 저장
            print(msg)					# 수신받은 data의 값(decoding 된 상태)을 출력
            conn.sendall(data)			# 수신받은 데이터를 다시 보냄
            if msg == 'bye':			# 수신받은 값이 bye라면 프로그램 종료
                conn.close()			# 정보를 수신받는 socket객체 sock을 close
                break					# 프로그램 종료

if __name__ == '__main__':
    run_server()

 

echo_client.py

import socket

def run_client(host='127.0.0.1', port=7788):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # socket 객체 생성
        sock.connect((host, port)) # sock 객체를 127.0.0.1의 7788과 연결
        for _ in range(10):
            data = input(">>")
            sock.sendall(data.encode())	# input을 통해 입력받은 data를 encoding해서 전달
            if data == 'bye': 			# 만약 입력값이 bye라면 프로그램 종료
                sock.close()			# socket 객체를 close state로 변경
                break
            res = sock.recv(1024)		# res에 sock 객체가 수신하는 값을 저장
            print(res.decode())			# 수신받은 값을 decoding해서 출력

if __name__ == '__main__':
    run_client()

muliconn-server.py

import socket 
from _thread import *
 
def threaded(client_socket, addr): # 멀티쓰레드 함수 생성
    print('Connected by :', addr[0], ':', addr[1]) # addr[0] -> IP 주소, addr[1] -> 포트번호 
    
    while True: 
        try:
            data = client_socket.recv(1024)

            if not data: 
                print('Disconnected by ' + addr[0],':',addr[1])
                break

            print('Received from ' + addr[0],':',addr[1] , data.decode())
            client_socket.send(data) 

        except ConnectionResetError as e: 			# 예외처리
            print('Disconnected by ' + addr[0],':',addr[1])
            break
             
    client_socket.close() 


HOST = '127.0.0.1'
PORT = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT)) 	# 서버는 IP주소와 포트를 socket 객체와 연결
server_socket.listen() 				# listen state로 변경

print('server start')


while True: 
    print('wait')

    client_socket, addr = server_socket.accept() # server_socket이 전달받는 값을 저장
    start_new_thread(threaded, (client_socket, addr)) 			# 새로운 스레드를 계속 생성

server_socket.close() 

 

multiconn-client.py

import socket 

HOST = '127.0.0.1'
PORT = 9999

client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

client_socket.connect((HOST, PORT)) # client는 connect를 통해 특정 서버의 IP주소의 포트에 연결
 
while True: 
    message = input('Enter Message : ')
    if message == 'quit':
    	break

    client_socket.send(message.encode()) # encoding한 메시지 전달
    data = client_socket.recv(1024) 	 # 서버로부터 전달받은 메시지 출력

    print('Received from the server :',repr(data.decode())) 


client_socket.close() 

multiconn-server.py를 먼저 실행시키고,

소스코드가 동일한 multiconn-client.py와 multiconn-client2.py를 차례로 실행시켜서 메시지를 입력하면 하나의 서버에서 여러 개의 클라이언트를 멀티스레드를 통해 동시에 처리 가능

'Information Technology' 카테고리의 다른 글

[JAVA 기초] Static과 Public  (0) 2020.01.16
[React Native] Weather APP  (0) 2020.01.14
[React] 리액트 시작하고 사용해보기  (0) 2020.01.11