Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 리눅스기초#리눅스명령어#리눅스 tail#tail#모의해킹 리눅스
- 패스트 캠퍼스 #자율주행 #비전
- pdf 번역
- 파이썬 유튜브
- 파이썬 채팅
- 파파고 꿀팁
- 파이썬 음성파일 텍스트 변환
- 파이선 행
- 리눅스#모의해킹#리눅스명령어#head 명령어
- PDF 개행문자
- 크롬오류#크롬검색어자동완성끄기#검색어자동완성오류#검색어자동완성 제거#검색어 노란선#검색어반복입력
- 파이썬 파일 전송
- ROS #spin() #spinOnce() #ROS기초
- 파이썬 엑셀 파일 읽고 쓰기
- 통계 #ROC #TPR #FPR #TNR #이진분류 #Accuracy #Recall
- 파이썬 음성인식
- 파이썬#파이썬경로#파이썬폴더#파이썬디렉토리
- QGC#QGrouncControl#GLIB오류
- 파이썬 #파이썬프로젝트 #파이썬 예시 #파이썬 파일경로 #파이썬 자동화
- 논문번역 꿀팁
- 파이썬 프로젝트
- 파이썬 열
- 파이썬#subprocess#communicate()
- 파이썬 #
- 파이썬
- 파파고 번역
- 파이썬 텍스트 변환 #파이썬 공부
- 파이썬 예시
- ROS #Robotics #ROS기초
- 스트림 암호 one-time-pad 공격#보안#암호
Recent Comments
Archives
개발자비행일지
파이썬 채팅, 다중 채팅, gui, 파일 전송 본문
먼저, 서버 측 코드를 작성하겠습니다.
import socket
import threading
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QTextEdit, QLineEdit, QPushButton
class ChatWindow(QMainWindow):
def __init__(self, host, port):
super().__init__()
self.host = host
self.port = port
self.username = None
self.socket = None
self.setWindowTitle("다중 채팅 시스템")
self.setGeometry(100, 100, 500, 400)
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout()
self.central_widget.setLayout(self.layout)
self.text_area = QTextEdit()
self.text_area.setReadOnly(True)
self.layout.addWidget(self.text_area)
self.input_field = QLineEdit()
self.input_field.returnPressed.connect(self.send_message)
self.layout.addWidget(self.input_field)
self.connect_to_server()
def connect_to_server(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.username, ok = self.get_username()
if not ok:
self.close()
self.socket.send(self.username.encode())
receive_thread = threading.Thread(target=self.receive_messages)
receive_thread.start()
def get_username(self):
username, ok = QInputDialog.getText(
self,
"사용자 이름 입력",
"사용자 이름을 입력하세요:"
)
return username, ok
def receive_messages(self):
while True:
try:
message = self.socket.recv(1024).decode()
self.text_area.append(message)
except Exception as e:
print(f"서버와의 연결이 끊어졌습니다: {str(e)}")
self.socket.close()
break
def send_message(self):
message = self.input_field.text()
self.input_field.clear()
self.socket.send(message.encode())
if message == "!quit":
self.socket.close()
self.close()
if __name__ == "__main__":
app = QApplication([])
window = ChatWindow("127.0.0.1", 12345)
window.show()
app.exec_()
위의 코드는 다중 사용자 채팅 서버를 구현한 것입니다. 서버는 클라이언트의 연결을 받아들이고 관리하며, 클라이언트들 간의 메시지를 중개합니다. 새로운 클라이언트가 연결되면 클라이언트 소켓과 사용자 이름을 리스트에 추가하고, 새로운 스레드에서 해당 클라이언트를 처리합니다. 클라이언트가 메시지를 보내면 다른 클라이언트들에게 메시지를 전송하며, 클라이언트가 연결을 종료하면 클라이언트를 제거하고 소켓을 닫습니다.
다음으로, 클라이언트 측 코드를 작성하겠습니다. 다음은 간단한 클라이언트 코드입니다.
import socket
import threading
class ChatServer:
def __init__(self, host, port):
self.host = host
self.port = port
self.server_socket = None
self.client_sockets = []
self.client_usernames = []
def start(self):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((self.host, self.port))
self.server_socket.listen(5)
print(f"서버가 {self.host}:{self.port}에서 실행 중입니다.")
while True:
client_socket, client_address = self.server_socket.accept()
print(f"새로운 클라이언트가 연결되었습니다: {client_address}")
username = client_socket.recv(1024).decode()
self.client_sockets.append(client_socket)
self.client_usernames.append(username)
client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))
client_thread.start()
def handle_client(self, client_socket):
while True:
try:
message = client_socket.recv(1024).decode()
if message:
self.broadcast(message, client_socket)
else:
self.remove_client(client_socket)
break
except Exception as e:
print(f"클라이언트와의 연결이 끊어졌습니다: {str(e)}")
self.remove_client(client_socket)
break
def broadcast(self, message, sender_socket):
for client_socket in self.client_sockets:
if client_socket != sender_socket:
client_socket.send(message.encode())
def remove_client(self, client_socket):
if client_socket in self.client_sockets:
index = self.client_sockets.index(client_socket)
username = self.client_usernames[index]
self.client_sockets.remove(client_socket)
self.client_usernames.remove(username)
client_socket.close()
self.broadcast(f"{username}님이 나갔습니다.", client_socket)
if __name__ == "__main__":
server = ChatServer("127.0.0.1", 12345)
server.start()
위의 코드는 다중 사용자 채팅 클라이언트를 구현한 것입니다. 클라이언트는 서버에 연결한 후 사용자 이름을 입력하고, 서버로부터 메시지를 수신하고 메시지를 전송합니다. 클라이언트는 PyQt5를 사용하여 GUI를 구성합니다.
서버와 클라이언트 코드를 각각 실행하여 다중 사용자 간의 채팅을 테스트할 수 있습니다. 서버 코드를 먼저 실행한 다음, 여러 개의 클라이언트를 실행하여 서버에 연결하고 메시지를 주고받을 수 있습니다. 클라이언트들 간의 채팅은 서버를 통해 중개되며, 사용자 이름을 통해 구분됩니다.
서버와 클라이언트 코드를 함께 실행하면 다중 사용자가 사용하는 채팅 시스템이 구현되며, 클라이언트들은 서버를 통해 채팅을 주고받을 수 있습니다.
'▶ Python' 카테고리의 다른 글
파이썬, 파이썬으로 유튜브 동영상 텍스트 변환하기 (0) | 2023.07.25 |
---|---|
파이썬 프로젝트, 음성 파일 텍스트로 변환하기 (0) | 2023.07.25 |
파이썬 엑셀, 텍스트 파일로 엑셀 파일 만들기 (0) | 2023.07.19 |
파이썬 엑셀, 특정 횡과 열의 데이터 읽고 쓰기 (0) | 2023.07.19 |
파이썬 폴더 정리 스크립트 (0) | 2023.01.23 |