파이썬
소켓통신(서버-클라이언트간 1:1 채팅)
가오가이거
2020. 12. 14. 18:37
# 서버 코드
import threading, socket
class UniServer:
#class 변수 / static 변수
ip='localhost' #or 본인 ip or 127.0.0.1
port = 5555
def __init__(self):
self.server_soc = None #서버 소켓(대문)
self.client_soc = None #클라이언트와 1:1 통신 소켓
def open(self):
self.server_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_soc.bind((UniServer.ip, UniServer.port))
self.server_soc.listen()
def sendMsg(self):#키보드 입력받아 상대방에게 메시지 전송.
while True:
msg = input('msg:')
data = msg.encode(encoding='utf-8')
self.client_soc.sendall(data)
if msg == '/stop':
break
def recvMsg(self):#상대방이 보낸 메시지 읽어서 화면에 출력
while True:
data = self.client_soc.recv(1024)
msg = data.decode()
print('상대방 메시지:', msg)
if msg == '/stop':
break
def run(self):
self.open()
self.client_soc, addr = self.server_soc.accept()#클라이언트 1명만 받음
print(addr, '접속함')
th1 = threading.Thread(target=self.sendMsg)
th1.start()
th2 = threading.Thread(target=self.recvMsg)
th2.start()
def close(self):
self.client_soc.close()
self.server_soc.close()
def main():
server = UniServer()
server.run()
main()
# 클라이언트 코드
import socket, threading
class UniClient:
ip = 'localhost' # or 본인 ip or 127.0.0.1
port = 5555
def __init__(self):
self.client_soc = None
def conn(self):
self.client_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_soc.connect((UniClient.ip, UniClient.port))
def sendMsg(self): # 키보드 입력받아 상대방에게 메시지 전송.
while True:
msg = input('msg:')
data = msg.encode(encoding='utf-8')
self.client_soc.sendall(data)
if msg == '/stop':
break
def recvMsg(self): # 상대방이 보낸 메시지 읽어서 화면에 출력
while True:
data = self.client_soc.recv(1024)
msg = data.decode()
print('상대방 메시지:', msg)
if msg == '/stop':
break
def run(self):
self.conn()
th1 = threading.Thread(target=self.sendMsg)
th1.start()
th2 = threading.Thread(target=self.recvMsg)
th2.start()
def main():
c = UniClient()
c.run()
main()