Python 인터넷 채 팅 방 의 예제 코드 구현(다 중 채 팅 및 개인 채 팅 지원)
인터넷 채 팅 방
기능:
i.Socket 을 이용 하여 프로 그래 밍 하 는 기술 파악
ii.다 중 스 레 드 기술 을 파악 하여 쌍방 이 동시에 발송 할 수 있 도록 확보한다.
iii.메 신 저 만 들 기
1 인 채 팅 가능
v.여러 사람과 동시에 채 팅 할 수 있다
vi.그래 픽 인터페이스 를 사용 하여 쌍방의 어록 을 표시 합 니 다.
vii.프로그램 은 어느 정도 오류 인식 을 할 수 있 습 니 다.
개술
실험 은 채 팅 방 을 통 해 1 인 또는 여러 사람 간 의 채 팅 통신 을 완성 할 수 있 으 며,기능 의 실현 은 주로 Socket 통신 을 통 해 이 루어 진다.이번 실험 은 클 라 이언 트/서버(C/S)구조 모드 를 사용 하여 Python 언어 를 통 해 서버 쪽 과 클 라 이언 트 의 프로그램 을 작성 합 니 다.다 중 스 레 드 를 활용 하면 다 중 채 팅 을 완성 할 수 있 습 니 다.
서버 엔 드 프로그램 은 주로 사용자 정보,메시지 수신 과 퍼 가기 에 사용 된다.
클 라 이언 트 프로그램 은 사용자 등록 로그 인,채 팅 정보 표시 와 정보 입력 을 실현 합 니 다.
코드 해석
현재 온라인 인원 을 집계 하고 새 사용 자 를 사용자 목록 에 추가 합 니 다.
Serve.py
이것 은 서버 가 채 팅 서비스 에 대한 실현 이다.
threading.Thread 클래스 를 계승 하여 다 중 스 레 드 를 실현 하고 run 함 수 를 다시 씁 니 다.
클 라 이언 트 에서 온 사용자 이름 을 받 아들 이 고 사용자 이름 이 비어 있 으 면 사용자 의 IP 와 포트 를 사용자 이름 으로 사용 합 니 다.사용자 이름 이 중복 되면 나타 난 사용자 이름 에 접미사'2','3','4'를 붙 입 니 다.
사용자 이름 을 가 져 오 면 사용자 측 에서 보 내 온 메시지(즉 채 팅 내용)를 계속 받 아들 이 고 끝 난 후에 연결 을 닫 습 니 다.
사용자 가 연결 을 끊 으 면 이 사용 자 를 사용자 목록 에서 삭제 하고 사용자 목록 을 업데이트 합 니 다.
주소 와 데 이 터 를 클 라 이언 트 에 보 내야 합 니 다.messages 대기 열 에 저장 합 니 다.
서버 는 데 이 터 를 받 은 후에 이 를 처리 한 다음 에 클 라 이언 트 에 게 보 냅 니 다.다음 그림 은 채 팅 내용 에 대해 서버 는 클 라 이언 트 에 게 직접 보 내 고 사용자 목록 에 대해 json.dumps 가 처리 한 후에 보 냅 니 다.
Client.py
연결 을 구축 하고 사용자 이름 을 보 내 며 개인 채 팅 인지 여 부 를 판단 하 며 개인 채 팅 용~식별
서버 에서 보 낸 메시지 받 기
받 은 메 시 지 를 판단 합 니 다.온라인 사용자 목록(json.dumps 로 처리)이 라면 온라인 사용자 목록 상 자 를 비우 고 이 목록 을 온라인 사용자 목록 상자 에 출력 합 니 다.
채 팅 내용 이 라면 채 팅 내용 표시 상자 에 출력 합 니 다.
로그 인 창 설정
메시지 인터페이스 설정
온라인 사용자 목록 을 설정 합 니 다.
전체 코드:
Serve.py
import socket
import threading
import queue
import json # json.dumps(some) json.loads(some)
import os
import os.path
import sys
IP = '127.0.0.1'
PORT = 9999 #
messages = queue.Queue()
users = [] # 0:userName 1:connection
lock = threading.Lock()
def onlines(): #
online = []
for i in range(len(users)):
online.append(users[i][0])
return online
class ChatServer(threading.Thread):
global users, que, lock
def __init__(self): #
threading.Thread.__init__(self)
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
os.chdir(sys.path[0])
# , , IP 。 , “2”、“3”、“4”……
def receive(self, conn, addr): #
user = conn.recv(1024) #
user = user.decode()
if user == ' ':
user = addr[0] + ':' + str(addr[1])
tag = 1
temp = user
for i in range(len(users)): # ,
if users[i][0] == user:
tag = tag + 1
user = temp + str(tag)
users.append((user, conn))
USERS = onlines()
self.Load(USERS,addr)
# ( ), 。
try:
while True:
message = conn.recv(1024) #
message = message.decode()
message = user + ':' + message
self.Load(message,addr)
conn.close()
# , , 。
except:
j = 0 #
for man in users:
if man[0] == user:
users.pop(j) #
break
j = j+1
USERS = onlines()
self.Load(USERS,addr)
conn.close()
# ( ) messages 。
def Load(self, data, addr):
lock.acquire()
try:
messages.put((addr, data))
finally:
lock.release()
# , , , , , , json.dumps 。
def sendData(self): #
while True:
if not messages.empty():
message = messages.get()
if isinstance(message[1], str):
for i in range(len(users)):
data = ' ' + message[1]
users[i][1].send(data.encode())
print(data)
print('
')
if isinstance(message[1], list):
data = json.dumps(message[1])
for i in range(len(users)):
try:
users[i][1].send(data.encode())
except:
pass
def run(self):
self.s.bind((IP,PORT))
self.s.listen(5)
q = threading.Thread(target=self.sendData)
q.start()
while True:
conn, addr = self.s.accept()
t = threading.Thread(target=self.receive, args=(conn, addr))
t.start()
self.s.close()
if __name__ == '__main__':
cserver = ChatServer()
cserver.start()
Client.py
import socket
import tkinter
import tkinter.messagebox
import threading
import json
import tkinter.filedialog
from tkinter.scrolledtext import ScrolledText
IP = ''
PORT = ''
user = ''
listbox1 = '' #
show = 1 #
users = [] #
chat = '------Group chat-------' #
#
root0 = tkinter.Tk()
root0.geometry("300x150")
root0.title(' ')
root0.resizable(0,0)
one = tkinter.Label(root0,width=300,height=150,bg="LightBlue")
one.pack()
IP0 = tkinter.StringVar()
IP0.set('')
USER = tkinter.StringVar()
USER.set('')
labelIP = tkinter.Label(root0,text='IP ',bg="LightBlue")
labelIP.place(x=20,y=20,width=100,height=40)
entryIP = tkinter.Entry(root0, width=60, textvariable=IP0)
entryIP.place(x=120,y=25,width=100,height=30)
labelUSER = tkinter.Label(root0,text=' ',bg="LightBlue")
labelUSER.place(x=20,y=70,width=100,height=40)
entryUSER = tkinter.Entry(root0, width=60, textvariable=USER)
entryUSER.place(x=120,y=75,width=100,height=30)
def Login(*args):
global IP, PORT, user
IP, PORT = entryIP.get().split(':')
user = entryUSER.get()
if not user:
tkinter.messagebox.showwarning('warning', message=' !')
else:
root0.destroy()
loginButton = tkinter.Button(root0, text =" ", command = Login,bg="Yellow")
loginButton.place(x=135,y=110,width=40,height=25)
root0.bind('<Return>', Login)
root0.mainloop()
#
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, int(PORT)))
if user:
s.send(user.encode()) #
else:
s.send(' '.encode())
user = IP + ':' + PORT
#
root1 = tkinter.Tk()
root1.geometry("640x480")
root1.title(' ')
root1.resizable(0,0)
#
listbox = ScrolledText(root1)
listbox.place(x=5, y=0, width=640, height=320)
listbox.tag_config('tag1', foreground='red',backgroun="yellow")
listbox.insert(tkinter.END, ' , !', 'tag1')
INPUT = tkinter.StringVar()
INPUT.set('')
entryIuput = tkinter.Entry(root1, width=120, textvariable=INPUT)
entryIuput.place(x=5,y=320,width=580,height=170)
#
listbox1 = tkinter.Listbox(root1)
listbox1.place(x=510, y=0, width=130, height=320)
def send(*args):
message = entryIuput.get() + '~' + user + '~' + chat
s.send(message.encode())
INPUT.set('')
sendButton = tkinter.Button(root1, text ="
",anchor = 'n',command = send,font=('Helvetica', 18),bg = 'white')
sendButton.place(x=585,y=320,width=55,height=300)
root1.bind('<Return>', send)
def receive():
global uses
while True:
data = s.recv(1024)
data = data.decode()
print(data)
try:
uses = json.loads(data)
listbox1.delete(0, tkinter.END)
listbox1.insert(tkinter.END, " ")
listbox1.insert(tkinter.END, "------Group chat-------")
for x in range(len(uses)):
listbox1.insert(tkinter.END, uses[x])
users.append('------Group chat-------')
except:
data = data.split('~')
message = data[0]
userName = data[1]
chatwith = data[2]
message = '
' + message
if chatwith == '------Group chat-------': #
if userName == user:
listbox.insert(tkinter.END, message)
else:
listbox.insert(tkinter.END, message)
elif userName == user or chatwith == user: #
if userName == user:
listbox.tag_config('tag2', foreground='red')
listbox.insert(tkinter.END, message, 'tag2')
else:
listbox.tag_config('tag3', foreground='green')
listbox.insert(tkinter.END, message,'tag3')
listbox.see(tkinter.END)
r = threading.Thread(target=receive)
r.start() #
root1.mainloop()
s.close()
파 이 썬 이 인터넷 채 팅 방 을 실현 하 는 예제 코드(다 중 채 팅 과 개인 채 팅 지원)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 인터넷 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많이 지 켜 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.