Mike_python小 发表于 2023-1-25 19:45:12

重启python聊天室

本帖最后由 Mike_python小 于 2023-1-26 08:03 编辑

过年了,有压岁钱了{:10_256:} 买个服务器重启聊天室{:10_256:}

请使用一下客户端登入:
Windows:
from tkinter import *
from tkinter.font import Font
# from tkinter.ttk import *
from tkinter import messagebox as mg
import time
import threading
import socket

def center_window(root, width, height):
    """
    窗口居中代码
    """
    screenwidth = root.winfo_screenwidth()# 获取显示屏宽度
    screenheight = root.winfo_screenheight()# 获取显示屏高度
    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)# 设置窗口居中参数
    root.geometry(size)# 让窗口居中显示

def fasong(*args):
    time.sleep(0.1)
    # re_data = input(">>")
    re_data = send_entry.get("1.0", END)[:-1]
    if 'exit' == re_data:   # 判断是否退出
      client.send(("Q "+ username).encode())# 发送退出的请求
      client.close()

    elif (re_data != " \n" and re_data != "\n" and re_data != "" and re_data != " "):    # 判断内容不为空
      client.send(("C " + username + ": " + re_data).encode())
      time_ = time.strftime('%Y-%m-%d %H:%M:%S')                  # 以下为自己说的话

      chat_text.config(state=NORMAL)

      #f1 = Font("微软雅黑", 8)
      chat_text.tag_config("tag_3", font=("微软雅黑", 9), foreground="grey")
      chat_text.insert(END, time_, "tag_3")   # 发送时间
      chat_text.insert(END, "\n")

      #f = Font("微软雅黑", 13)
      chat_text.tag_config("tag_41", font=("微软雅黑", 14), foreground="#808080")
      chat_text.insert(END, username + ":", "tag_41")    # 发送文本内容
      chat_text.insert(END, "\n")
      
      #f = Font("微软雅黑", 12)
      chat_text.tag_config("tag_4", font=("微软雅黑", 13), foreground="#2E8B57")
      chat_text.insert(END, re_data, "tag_4")    # 发送文本内容
      chat_text.insert(END, "\n")

      chat_text.config(state=DISABLED)
      chat_text.see("end")    # 转到最后一行


      # send_entry.first()
      # send_entry.delete(0.1,2.0)      # 设置发送为空
      # send_entry.insert('1 wordstart' , "s")
      # time.sleep(0.1)
      send_entry.delete("0.0", END)   # 设置发送为空


def fa_(*args):
    fasong()
    # send_entry.delete("0.0", END)   # 设置发送为空
    return 'break'




def jieshou():
    while True:
      # time.sleep(0.3)
      try:
            data = client.recv(1024)
            res = data.decode()
            if(res != ''):

                # print("1")
                if (res.split(" ", 2)=="C"): # 如果为聊天的请求
                  # print(res.split(" ", 1))
                  # print(res.split(" ", 1))
                  # print(res)
                  time_ = time.strftime('%Y-%m-%d %H:%M:%S')

                  chat_text.config(state=NORMAL)

                  #f1 = Font("微软雅黑", 10)
                  chat_text.tag_config("tag_1", font=("微软雅黑", 9), foreground="grey")   
                  chat_text.insert(END, time_, "tag_1")
                  chat_text.insert(END, "\n")

                  #f = Font("微软雅黑", 13)
                  chat_text.tag_config("tag", font=("微软雅黑", 14), foreground="#808080")
                  chat_text.insert(END, res.split(" ", 2), "tag")
                  chat_text.insert(END, "\n")
                  
                   #f = Font("微软雅黑", 12)
                  chat_text.tag_config("tag_2", font=("微软雅黑", 13))
                  chat_text.insert(END, res.split(" ", 2), "tag_2")
                  chat_text.insert(END, "\n")

                  chat_text.config(state=DISABLED)
                  chat_text.see("end")


                elif(res.split(" ", 1)=="R"):    # 在线用户请求
                  afd = False
                  print(res.split(" ", 1))
                  for kk in range(0, online_user.size()): # 循环判断在线列表里是否有用户名
                        if online_user.get(kk) == (res.split(" ", 1)):   # 检测到是
                            afd = True# 判断变量为真
                            break   # 退出
                  if (afd ==False): # 如果判断变量为假
                        online_user.insert(END,res.split(" ", 1))    # 插入用户名


                elif(res.split(" ", 1)=="E"):    # 退出请求
                  for kk in range(0, online_user.size()): # 循环判断要删除的用户名
                        if online_user.get(kk) == (res.split(" ", 1)):   
                            online_user.delete(kk)# 从在线列表去除
                            break
                        


      # else:
      #   continue
      except Exception as e:
            print(e)
            print("客户端已退出")
            #break

def send():
    """
    发送文字
    """
    global username
    username = username_string.get()    # 用户名变量
    # time.sleep(3)


    if __name__ == "__main__":
      # print("Welcome to Gouzi WD Chat")
      # print(username)
      #注册业务
      while True:
            # username=input("请输入用户名")
            if ' ' not in username and username != " " and username != "":# 判断用户名不为空
                client.send(("R "+username + " " + password_string.get()+"\n").encode())   # 发送注册请求
                data=client.recv(2048).decode() # 最大接受字节

                if data=="OK":# 如果穿回信息为 “OK”
                  break
            else:
                mg.showerror("", "用户名不能为空,请强制退出后重新进入")    # 用户名如果为空,发出警告
               


      try:
            # 创建一个新的线程
            new_thread = threading.Thread(target=jieshou, name="T1")   
            # 启动新线程
            new_thread.start()


            new_thread1 = threading.Thread(target=fasong, name="T2")
            # 启动新线程
            new_thread1.start()
      except:
            client.close()

def insert_newline(*args):
    send_entry.insert("insert", "\n")
    return "break"





def main():
    """
    加入聊天后界面
    """
    global chat_text, send_msg, online_user, send_entry
    root = Toplevel()
    root.title("聊天界面")
    center_window(root, 800, 500)

    send_msg = StringVar()


    """
    ——————————————————————————
    查收文件text开始
    """

    frame = Frame(root)
    frame.place(x = 20, y = 20)

    gun_song_tiao_y = Scrollbar(frame)
    gun_song_tiao_x = Scrollbar(frame, orient=HORIZONTAL)

    chat_text = Text(frame, height=14, width=50, wrap='none', relief=GROOVE, state=DISABLED, font=('微软雅黑', 14))#, state=DISABLED


    gun_song_tiao_y.pack(side=RIGHT,fill=Y)
    gun_song_tiao_x.pack(side=BOTTOM, fill=X)

    chat_text.pack()

    gun_song_tiao_y.config(command=chat_text.yview)
    gun_song_tiao_x.config(command=chat_text.xview)

    chat_text.config(yscrollcommand=gun_song_tiao_y.set)
    chat_text.config(xscrollcommand=gun_song_tiao_x.set)

    """
    查收文件区域text结束
    ——————————————————————————
    """



    send_entry = Text(root, width=70, height=6) # 发送区域
    send_entry.place(x=20, y=390)


    send_button = Button(root, text="发送", command=fa_)   # 发送按钮
    send_button.place(x=520, y=390)

    send_entry.bind("<Return>", fa_)
    send_entry.bind("<Control-Return>", insert_newline)

    Label(root, text="在线列表", font=("微软雅黑", 18)).place(x=600, y=20)

    online_user = Listbox(root, height=20)
    online_user.place(x=600, y=50)
    # online_user.insert(END, username_string.get())


def help():
    """
    帮助界面
    """
    mg.showerror("暂无", "NONE")

def if_login(*args):
    main()
    send()

def if_res():
    pass



def login():
    """注册/登陆"""
    global username_string
    global username_string, password_string
    global client

    root = Tk()
    center_window(root, 400, 300)   # 实现页面居中
    root.title("Gouzi WD在线聊天室")    # 标题

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('119.3.215.140', 80))

    username_string = StringVar()   # 存储用户名变量
    password_string = StringVar()   # 密码存储变量

    Label(root, text="登陆界面", font=("微软雅黑", 20)).place(x=130, y=30)# 表头


    Label(root, text="用户名:", font=("微软雅黑", 14)).place(x=10, y=100)# 用户名一栏
    username = Entry(root, textvariable=username_string)    #用户名Entry
    username.place(x=110, y=100)

    Label(root, text="密码:", font=("微软雅黑", 14)).place(x=10, y=150)# 密码一栏
    password = Entry(root, textvariable=password_string)    # 密码Entry
    password.place(x=110, y=150)

    username.bind("<Return>", if_login)
    password.bind("<Return>", if_login)



    join_button = Button(root, text="登陆", command=if_login, font=("微软雅黑", 12))    # 进入聊天界面按钮
    join_button.place(x=60, y=200)

    res_button = Button(root, text="注册", command=if_res, font=("微软雅黑", 12))    # 注册
    res_button.place(x=230, y=200)

    # if_login()


    root.mainloop()

login()





# def login():
#   """
#   登陆界面,也是初始界面
#   """
#   root = Tk()
#   center_window(root, 400, 500)   # 实现页面居中
#   root.title("Gouzi WD在线聊天室")    # 标题

#   username_string = StringVar()   # 存储用户名变量
#   ip_string = StringVar() # ip存储变量
#   password_string = StringVar()   # 密码存储变量

#   Label(root, text="初始界面", font=("微软雅黑", 20)).place(x=130, y=30)# 表头


#   Label(root, text="用户名:", font=("微软雅黑", 14)).place(x=10, y=100)# 用户名一栏
#   username = Entry(root, textvariable=username_string)    #用户名Entry
#   username.place(x=110, y=100)

#   Label(root, text="ip:", font=("微软雅黑", 14)).place(x=10, y=150)# ip一栏
#   ip = Entry(root, textvariable=ip_string)    #ipEntry
#   ip.place(x=110, y=150)

#   Label(root, text="ip密码(选填):", font=("微软雅黑", 14)).place(x=10, y=200)# 密码一栏
#   password = Entry(root, textvariable=password_string)    # 密码Entry
#   password.place(x=110, y=200)

#   Label(root, text="预留位:", font=("微软雅黑", 14)).place(x=10, y=250)# 预留一栏
#   password = Entry(root)    # 预留Entry
#   password.place(x=110, y=250)

#   join_button = Button(root, text="进入", command=join, font=("微软雅黑", 12))    # 进入聊天界面按钮
#   join_button.place(x=160, y=300)

#   help_button = Button(root, text="帮助", font=("微软雅黑", 9), command=help)   # 帮助按钮
#   help_button.place(x=163, y=350)
#   # join()

#   root.mainloop()


Mac版本:
from tkinter import *
from tkinter.font import Font
# from tkinter.ttk import *
from tkinter import messagebox as mg
import time
import threading
import socket
# from socket import SIO_KEEPALIVE_VALS

def center_window(root, width, height):
    """
    窗口居中代码
    """
    screenwidth = root.winfo_screenwidth()# 获取显示屏宽度
    screenheight = root.winfo_screenheight()# 获取显示屏高度
    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)# 设置窗口居中参数
    root.geometry(size)# 让窗口居中显示

def fasong(*args):
    time.sleep(0.1)
    # re_data = input(">>")
    re_data = send_entry.get("1.0", END)[:-1]
    if 'exit' == re_data:   # 判断是否退出
      client.send(("Q "+ username).encode())# 发送退出的请求
      client.close()

    elif (re_data != " \n" and re_data != "\n" and re_data != "" and re_data != " "):    # 判断内容不为空
      client.send(("C " + username + ": " + re_data).encode())
      time_ = time.strftime('%Y-%m-%d %H:%M:%S')                  # 以下为自己说的话

      chat_text.config(state=NORMAL)

      f1 = Font(size=10)
      chat_text.tag_config("tag_3", font=f1, foreground="grey")
      chat_text.insert(END, time_, "tag_3")   # 发送时间
      chat_text.insert(END, "\n")

      f = Font(size=15)
      chat_text.tag_config("tag_41", font=f, foreground="#808080")
      chat_text.insert(END, username + ":", "tag_41")    # 发送文本内容
      chat_text.insert(END, "\n")
      
      f = Font(size=14)
      chat_text.tag_config("tag_4", font=f, foreground="#2E8B57")
      chat_text.insert(END, re_data, "tag_4")    # 发送文本内容
      chat_text.insert(END, "\n")

      chat_text.config(state=DISABLED)
      chat_text.see("end")    # 转到最后一行


      # send_entry.first()
      # send_entry.delete(0.1,2.0)      # 设置发送为空
      # send_entry.insert('1 wordstart' , "s")
      # time.sleep(0.1)
      send_entry.delete("0.0", END)   # 设置发送为空


def fa_(*args):
    fasong()
    # send_entry.delete("0.0", END)   # 设置发送为空
    return 'break'




def jieshou():
    while True:
      # time.sleep(0.3)
      try:
            data = client.recv(1024)
            res = data.decode()
            if(res != ''):

                # print("1")
                if (res.split(" ", 2)=="C"): # 如果为聊天的请求
                  # print(res.split(" ", 1))
                  # print(res.split(" ", 1))
                  # print(res)
                  time_ = time.strftime('%Y-%m-%d %H:%M:%S')

                  chat_text.config(state=NORMAL)

                  f1 = Font(size=10)
                  chat_text.tag_config("tag_1", font=f1, foreground="grey")   
                  chat_text.insert(END, time_, "tag_1")
                  chat_text.insert(END, "\n")

                  f = Font(size=15)
                  chat_text.tag_config("tag", font=f, foreground="#808080")
                  chat_text.insert(END, res.split(" ", 2), "tag")
                  chat_text.insert(END, "\n")
                  
                  f = Font(size=14)
                  chat_text.tag_config("tag_2", font=f)
                  chat_text.insert(END, res.split(" ", 2), "tag_2")
                  chat_text.insert(END, "\n")

                  chat_text.config(state=DISABLED)
                  chat_text.see("end")


                elif(res.split(" ", 1)=="R"):    # 在线用户请求
                  afd = False
                  print(res.split(" ", 1))
                  for kk in range(0, online_user.size()): # 循环判断在线列表里是否有用户名
                        if online_user.get(kk) == (res.split(" ", 1)):   # 检测到是
                            afd = True# 判断变量为真
                            break   # 退出
                  if (afd ==False): # 如果判断变量为假
                        online_user.insert(END,res.split(" ", 1))    # 插入用户名


                elif(res.split(" ", 1)=="E"):    # 退出请求
                  for kk in range(0, online_user.size()): # 循环判断要删除的用户名
                        if online_user.get(kk) == (res.split(" ", 1)):   
                            online_user.delete(kk)# 从在线列表去除
                            break
                        


      # else:
      #   continue
      except Exception as e:
            print(e)
            print("客户端已退出")
            #break

def send():
    """
    发送文字
    """
    global username
    username = username_string.get()    # 用户名变量
    # time.sleep(3)


    if __name__ == "__main__":
      # print("Welcome to Gouzi WD Chat")
      # print(username)
      #注册业务
      while True:
            # username=input("请输入用户名")
            if ' ' not in username and username != " " and username != "":# 判断用户名不为空
                client.send(("R "+username + " " + password_string.get()+"\n").encode())   # 发送注册请求
                data=client.recv(2048).decode() # 最大接受字节

                if data=="OK":# 如果穿回信息为 “OK”
                  break
            else:
                mg.showerror("", "用户名不能为空,请强制退出后重新进入")    # 用户名如果为空,发出警告
               


      try:
            # 创建一个新的线程
            new_thread = threading.Thread(target=jieshou, name="T1")   
            # 启动新线程
            new_thread.start()


            new_thread1 = threading.Thread(target=fasong, name="T2")
            # 启动新线程
            new_thread1.start()
      except:
            client.close()

def insert_newline(*args):
    send_entry.insert("insert", "\n")
    return "break"





def main():
    """
    加入聊天后界面
    """
    global chat_text, send_msg, online_user, send_entry
    root = Toplevel()
    root.title("聊天界面")
    center_window(root, 800, 500)

    send_msg = StringVar()


    """
    ——————————————————————————
    查收文件text开始
    """

    frame = Frame(root)
    frame.place(x = 20, y = 20)

    gun_song_tiao_y = Scrollbar(frame)
    gun_song_tiao_x = Scrollbar(frame, orient=HORIZONTAL)

    chat_text = Text(frame, height=20, width=60, wrap='none', relief=GROOVE, state=DISABLED, font=('微软雅黑', 14))#, state=DISABLED


    gun_song_tiao_y.pack(side=RIGHT,fill=Y)
    gun_song_tiao_x.pack(side=BOTTOM, fill=X)

    chat_text.pack()

    gun_song_tiao_y.config(command=chat_text.yview)
    gun_song_tiao_x.config(command=chat_text.xview)

    chat_text.config(yscrollcommand=gun_song_tiao_y.set)
    chat_text.config(xscrollcommand=gun_song_tiao_x.set)

    """
    查收文件区域text结束
    ——————————————————————————
    """



    send_entry = Text(root, width=70, height=6) # 发送区域
    send_entry.place(x=20, y=390)


    send_button = Button(root, text="发送", command=fa_)   # 发送按钮
    send_button.place(x=520, y=390)

    send_entry.bind("<Return>", fa_)
    send_entry.bind("<Control-Return>", insert_newline)

    Label(root, text="在线列表", font=("微软雅黑", 18)).place(x=600, y=20)

    online_user = Listbox(root, height=25)
    online_user.place(x=600, y=50)
    # online_user.insert(END, username_string.get())


def help():
    """
    帮助界面
    """
    mg.showerror("暂无", "NONE")

def if_login(*args):
    main()
    send()

def if_res():
    pass



def login():
    """注册/登陆"""
    global username_string
    global username_string, password_string
    global client

    root = Tk()
    center_window(root, 400, 300)   # 实现页面居中
    root.title("Gouzi WD在线聊天室")    # 标题

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('119.3.215.140', 80))
    # client.setsockopt(socket.SOL_SOCKET, socket.SOCK_STREAM, True)    # windows写法
    # client.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 60*1000, 30*1000))    # windows写法
    client.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE,True)

    #self.my_socket.ioctl(SIO_KEEPALIVE_VALS,(1,10000,1000))

    client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPALIVE, 10)#

    client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3)

    client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)

    username_string = StringVar()   # 存储用户名变量
    password_string = StringVar()   # 密码存储变量

    Label(root, text="登陆界面", font=("微软雅黑", 20)).place(x=130, y=30)# 表头


    Label(root, text="用户名:", font=("微软雅黑", 14)).place(x=10, y=100)# 用户名一栏
    username = Entry(root, textvariable=username_string)    #用户名Entry
    username.place(x=110, y=100)

    Label(root, text="密码:", font=("微软雅黑", 14)).place(x=10, y=150)# 密码一栏
    password = Entry(root, textvariable=password_string, show="*")    # 密码Entry
    password.place(x=110, y=150)

    username.bind("<Return>", if_login)
    password.bind("<Return>", if_login)



    join_button = Button(root, text="登陆", command=if_login, font=("微软雅黑", 12))    # 进入聊天界面按钮
    join_button.place(x=60, y=200)

    res_button = Button(root, text="注册", command=if_res, font=("微软雅黑", 12))    # 注册
    res_button.place(x=230, y=200)

    # if_login()


    root.mainloop()

login()





# def login():
#   """
#   登陆界面,也是初始界面
#   """
#   root = Tk()
#   center_window(root, 400, 500)   # 实现页面居中
#   root.title("Gouzi WD在线聊天室")    # 标题

#   username_string = StringVar()   # 存储用户名变量
#   ip_string = StringVar() # ip存储变量
#   password_string = StringVar()   # 密码存储变量

#   Label(root, text="初始界面", font=("微软雅黑", 20)).place(x=130, y=30)# 表头


#   Label(root, text="用户名:", font=("微软雅黑", 14)).place(x=10, y=100)# 用户名一栏
#   username = Entry(root, textvariable=username_string)    #用户名Entry
#   username.place(x=110, y=100)

#   Label(root, text="ip:", font=("微软雅黑", 14)).place(x=10, y=150)# ip一栏
#   ip = Entry(root, textvariable=ip_string)    #ipEntry
#   ip.place(x=110, y=150)

#   Label(root, text="ip密码(选填):", font=("微软雅黑", 14)).place(x=10, y=200)# 密码一栏
#   password = Entry(root, textvariable=password_string)    # 密码Entry
#   password.place(x=110, y=200)

#   Label(root, text="预留位:", font=("微软雅黑", 14)).place(x=10, y=250)# 预留一栏
#   password = Entry(root)    # 预留Entry
#   password.place(x=110, y=250)

#   join_button = Button(root, text="进入", command=join, font=("微软雅黑", 12))    # 进入聊天界面按钮
#   join_button.place(x=160, y=300)

#   help_button = Button(root, text="帮助", font=("微软雅黑", 9), command=help)   # 帮助按钮
#   help_button.place(x=163, y=350)
#   # join()

#   root.mainloop()

Mike_python小 发表于 2023-1-25 19:50:51

现已开启,可使用原密码登陆{:10_256:}{:10_256:}

学习编程中的Ben 发表于 2023-1-25 19:55:00

zhangjinxuan 发表于 2023-1-25 20:01:23

yeah!!

元豪 发表于 2023-1-25 20:09:52

有Bug!

元豪 发表于 2023-1-25 20:12:26

{:10_256:}{:10_256:}

tommyyu 发表于 2023-1-25 20:17:09

登录写成了登陆{:10_256:}

Mike_python小 发表于 2023-1-25 20:18:25

tommyyu 发表于 2023-1-25 20:17
登录写成了登陆

反馈到“反馈贴”

sfqxx 发表于 2023-1-25 21:02:44

支持{:7_146:}

sfqxx 发表于 2023-1-25 21:04:24

sfqxx 发表于 2023-1-25 21:05:04

本帖最后由 sfqxx 于 2023-1-25 21:07 编辑

{:10_256:}

sfqxx 发表于 2023-1-25 21:06:54

运行到哪里?@Mike_python小

Mike_python小 发表于 2023-1-25 21:08:53

sfqxx 发表于 2023-1-25 21:06
运行到哪里?@Mike_python小

什么叫运行到哪里

sfqxx 发表于 2023-1-25 21:09:28

Mike_python小 发表于 2023-1-25 21:08
什么叫运行到哪里

就是我怎么使用
怎么登录,聊天
(中奖绝缘体)

Mike_python小 发表于 2023-1-25 21:11:56

sfqxx 发表于 2023-1-25 21:09
就是我怎么使用
怎么登录,聊天
(中奖绝缘体)

先去我的帖子下评分注册{:10_277:},然后运行这个文件啊

Mike_python小 发表于 2023-1-25 21:18:04

sfqxx 发表于 2023-1-25 21:09
就是我怎么使用
怎么登录,聊天
(中奖绝缘体)

不是哥们,看我之前的帖子,有个python聊天室注册的,然后在那里评分5玉璧

sfqxx 发表于 2023-1-25 21:19:01

Mike_python小 发表于 2023-1-25 21:18
不是哥们,看我之前的帖子,有个python聊天室注册的,然后在那里评分5玉璧

6

sfqxx 发表于 2023-1-25 21:19:53

Mike_python小 发表于 2023-1-25 21:18
不是哥们,看我之前的帖子,有个python聊天室注册的,然后在那里评分5玉璧

找不到,麻烦把地址告诉我{:10_254:}

Mike_python小 发表于 2023-1-25 21:23:37

sfqxx 发表于 2023-1-25 21:19
找不到,麻烦把地址告诉我

没时间,自己找,去专辑里找也行

sfqxx 发表于 2023-1-25 21:27:15

Mike_python小 发表于 2023-1-25 21:23
没时间,自己找,去专辑里找也行

那个专辑{:10_245:}
页: [1] 2
查看完整版本: 重启python聊天室