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()
파 이 썬 이 인터넷 채 팅 방 을 실현 하 는 예제 코드(다 중 채 팅 과 개인 채 팅 지원)에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 인터넷 채 팅 방 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많이 지 켜 주세요!

좋은 웹페이지 즐겨찾기