import threading
import socket
class ClientThread(threading.Thread):
def __init__(self, client_address, client_socket):
threading.Thread.__init__(self)
self.client_socket = client_socket
print("New connection added: ", client_address)
def run(self):
print("Connection from : ", client_address)
while True:
# 클라이언트로부터 파일 이름을 받는다
file_name = self.client_socket.recv(1024).decode()
# 클라이언트가 연결을 끊었는지 확인
if not file_name:
print("Client disconnected")
break
try:
# 파일을 열어서 내용을 읽는다
with open(file_name, 'r') as f:
file_content = f.read()
# 파일의 내용을 클라이언트에게 전송한다
self.client_socket.send(file_content.encode())
except FileNotFoundError:
self.client_socket.send(b"File not found")
self.client_socket.close()
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8080
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(5)
print("Server is listening")
while True:
client_socket, client_address = server_socket.accept()
new_thread = ClientThread(client_address, client_socket)
new_thread.start()
모든 ip 주소에서 연결 요청을 할 수 있도록 0.0.0.0으로 host 설정
port는 8080으로 설정
TCP 방식으로 소켓 생성
클라이언트의 소켓과 주소를 받는다.
threading 라이브러리로 생성한 다중 스레드 클래스를 통해 클라이언트와 연결한 후 데이터를 주고 받는다.
전송 메서드는 바이트형 객체를 파라미터로 사용할 수 있기에 이를 주의한다.
import socket
SERVER_HOST = 'localhost'
SERVER_PORT = 8080
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))
while True:
# 서버에게 전송할 파일 이름
file_name = input("Enter file name to request from server: ")
if file_name == 'q':
break
client_socket.send(file_name.encode())
# 서버로부터 파일의 내용을 받아 출력한다
file_content = client_socket.recv(1024).decode()
print("File content from server: ")
print(file_content)
client_socket.close()
클라이언트 소켓을 생성한다.
서버 소켓으로 연결을 시도한다.
send: 파일 이름을 찾아 바이트 형태로 인코딩하여 서버에 전송
recv: 파일 내용을 입력 받아 디코딩하여 file_content에 담고 이를 출력한다.