소켓 통신을 이용하여 파일 내용 출력하기

이정연·2023년 6월 2일
0

Project

목록 보기
11/11

server.py

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()

host/port

  • 모든 ip 주소에서 연결 요청을 할 수 있도록 0.0.0.0으로 host 설정

  • port는 8080으로 설정

socket

TCP 방식으로 소켓 생성

bind/listen

  • 생성한 소켓을 설정한 ip와 port로 바인딩
  • 최대 5개 스레드까지 받을 수 있도록 설정

accept

클라이언트의 소켓과 주소를 받는다.

send/recv

threading 라이브러리로 생성한 다중 스레드 클래스를 통해 클라이언트와 연결한 후 데이터를 주고 받는다.

전송 메서드는 바이트형 객체를 파라미터로 사용할 수 있기에 이를 주의한다.

client.py

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()

socket

클라이언트 소켓을 생성한다.

connect

서버 소켓으로 연결을 시도한다.

send/recv

send: 파일 이름을 찾아 바이트 형태로 인코딩하여 서버에 전송

recv: 파일 내용을 입력 받아 디코딩하여 file_content에 담고 이를 출력한다.

profile
0x68656C6C6F21

0개의 댓글