728x90

서버와 클라이언트가 서로 양방향 통신을 하기 위해서는 Thread를 사용해야 합니다.

먼저 서버 코드입니다.

#tcpserver.py

from socket import *
import threading
import time

def send(sock):                 # 데이터 송신 함수
    while True:
        sendData = input(">>>")
        sock.send(sendData.encode("utf-8"))

def recv(sock):                 # 데이터 수신 함수
    while True:
        data = connectionSocket.recv(1024)
        print("상대방 ", data.decode("utf-8"))

host = "127.0.0.1"
port = 12345

serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((host,port))
serverSocket.listen(1)
print("대기중입니다")

connectionSocket,addr = serverSocket.accept()

print(str(addr),"에서 접속되었습니다.")

sender = threading.Thread(target=send, args=(connectionSocket,))            # 송신 쓰레드
receiever = threading.Thread(target=recv, args=(connectionSocket,))         # 수신 쓰레드

sender.start()
receiever.start()

while True:
    time.sleep(1)   # thread 간의 우선순위 관계 없이 다른 thread에게 cpu를 넘겨줌
    pass            # sleep(0)은 cpu 선점권을 풀지 않음

serverSocket.close()                                    # 서버 닫기

다음은 클라이언트 코드입니다.

# tcpclient.py

from socket import *
import threading
import time

def send(sock):
    while True:
        sendData = input(">>>")
        clientSocket.send(sendData.encode("utf-8"))

def recv(sock):
    while True:
        data = clientSocket.recv(1024)
        print("상대방 : ", data.decode("utf-8"))

ip = "127.0.0.1"
port = 12345

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((ip,port))

print("접속 완료")

sender = threading.Thread(target=send, args=(clientSocket,))
receiver = threading.Thread(target=recv, args=(clientSocket,))

sender.start()
receiver.start()

while True:
    time.sleep(1)
    pass

clientSocket.close()

728x90

'Programming > Python' 카테고리의 다른 글

Python TCP 소켓 프로그래밍하기  (0) 2020.01.13
Python 예외 처리하기  (0) 2020.01.10
Python 모듈 사용하기(random, datetime, time)  (0) 2020.01.10
Python class 사용하기  (0) 2020.01.10
Python 터틀 그래픽 사용하기  (0) 2020.01.09

+ Recent posts