이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)
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 |