当前位置 博文首页 > python聊天室(虽然很简洁,但是可以用)

    python聊天室(虽然很简洁,但是可以用)

    作者:wangziwenhk 时间:2021-09-17 18:24

    目录
    • python聊天室
      • 服务端
      • 客户端
    • 总结

      python聊天室

      很多人都觉得微信,QQ,ICQ(我不知道现在还能不能用了)都过于垃圾,想要自己做一个聊天室(或是聊天软件),所以我们可以自己做一个。

      想要做出聊天室(或是聊天软件),我们就需要搞清楚它们的原理,这里我们用一个图片

      来给你们看

      我们可以看到,服务端其实就只是起到了一个转发消息的原理,搞清楚原理,就开始做

      服务端

      import socket,threading #导入文件
      def shou(new_s,socket_list):#创建一个收的函数
          try:
              nikename = new_s.recv(1024).decode('utf-8').strip()#为当前客户端执行一次‘收'来获取
          except:
              new_s.close()#关闭当前客户端的套接字
              socket_list.remove(new_s)#去除套接字列表里的nes_s
              for i in socket_list:
                  i.send('\n公告:一个未知的人离开了聊天室......'.encode('utf-8'))#广播
              return None
          for i in socket_list:
              i.send(f'\n公告:欢迎{nikename}进入了聊天室........\n'.encode('utf-8'))#广播
          while 1:
              try:
                  recv_data = new_s.recv(1024).decode('utf-8')#如果接受到了客户端发来的信息
                  print(recv_data)#仅作提醒用
                  for i in socket_list:
                      i.send(f'{nikename}:{recv_data}'.encode('utf-8'))#广播
              except:
                  new_s.close()#关闭当前客户端的套接字
                  socket_list.remove(new_s)#去除套接字列表里的nes_s
                  for i in socket_list:
                      i.send(f'公告:{nikename}离开了聊天室......'.encode('utf-8'))#广播
                  break#跳出循环
      def fa(new_s):
          while 1:
              msg = input('')#发出
              new_s.send(msg.encode('utf-8'))
      #创建套接字
      s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      #绑定
      s.bind(("",5678))#端口
      #监听
      s.listen(5)
      print('服务端处于监听状态,等待客户端接入..........')
      socket_list = []
      while 1:
          #接入
          new_s,addr = s.accept()
          print('客户端已接入')
          socket_list.append(new_s)
          new_s.send('请输入昵称:'.encode('utf-8'))
          t1 = threading.Thread(target=shou,args=(new_s,socket_list))
          t2 = threading.Thread(target=fa,args=(new_s,))
          t1.start()
          t2.start()
      # new_s.close()
      # s.close()
      
      

      客户端

      怎么样,服务端是不是很简单?接下来我们做客户端

      import socket,threading
      import tkinter as tk
      #创建套接字
      a = 1
      s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      s.connect(("127.0.0.1",5678))#此处端口看服务端的端口,127.0.0.1要改成服务端主机的ipv4地址
      print('已链接服务端,通讯加密中')
      def shou(s,msg_texe):
          recv_data = s.recv(1024).decode('utf-8')
          msg_text.insert(tk.END, recv_data)
          while 1:
              recv_data = s.recv(1024).decode('utf-8')
              msg_text.insert(tk.END,recv_data)
      def fa():
          global a
          if a == 0:
              msg = input_text.get('0.0',tk.END)
              s.send(msg.encode('utf-8'))
              input_text.delete('0.0',tk.END)
          else:
              msg = input_text.get('0.0', tk.END)
              s.send(msg.encode('utf-8'))
              input_text.delete('0.0', tk.END)
              msg_text.delete('0.0', tk.END)
              a = 0
      
      app = tk.Tk()
      app.title('聊天室')
      #显示消息框
      msg_frame = tk.Frame(app,width=480,height=300)
      msg_frame.grid(row=0,column=0,padx=6,pady=6)
      msg_frame.grid_propagate(0)#固定Frame的大小
      msg_text = tk.Text(msg_frame,bg='white')
      msg_text.grid()
      # msg_text.insert('0.0','hhh')
      #输入
      input_frame = tk.Frame(app,width=480,height=100)
      input_frame.grid(row=1,column=0)
      input_frame.grid_propagate(0)
      input_text = tk.Text(input_frame,bg='white')
      input_text.grid()
      #发送按钮
      btn_frame = tk.Frame(app,width=480,height=20)
      btn_frame.grid(row=2,column=0,sticky='E')
      button = tk.Button(btn_frame,text='发送',command=fa)
      button.grid()
      #线程
      t1 = threading.Thread(target=shou,args=(s,msg_text))
      t1.daemon = True
      t1.start()
      app.mainloop()
      #s.close()
      
      

      伸手党下载链接:https://pan.baidu.com/s/1KD6p_a2KgFxbOVN5yftQRw

      提取码:2iwk

      总结

      本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注站长博客的更多内容!

      jsjbwy