基于TCP协议网上聊天程序(python)带界面

1 设计目标
基于TCP协议网上聊天程序
实现一简单的聊天程序实现网上聊天,包括服务器和客户端。
(1)支持多人聊天;
(2)客户端具有图形化用户界面;
(3)客户端之间具有群发和私聊的功能。

2 用python实现的TCP通信模型
TCP客户端:通过connect((ip, port))来请求连接,send()进行发送消息,recv()进行接受消息。
TCP服务器: 通过bind((ip, port))绑定ip和端口,ip不写则代表默认本机所有地址,listen()控制客服端的连接数量,accept()等待阻塞,一直到客户端的到来,recv()接受消息,send()发送消息。
具体过程如下:

3 实现了简单的TCP聊天程序实现网上聊天,通过对服务器和端口的输入,可以在不同的主机上运行并将其服务器与客户端连接,用多线程可以支持多人同时聊天,客户端具有图形化用户界面,客户端之间具有群发和私聊的功能并且能知道实时的用户在线名单,界面显示效果良好,整体完成效果良好。

客户端client:

# -*- coding: utf-8 -*-
"""
Created on Tue May 12 23:49:20 2020@author: LENOVO
"""
import tkinter
import socket
import threading
import timewin = tkinter.Tk()
win.title("客户端")
win.geometry("400x300+300+200")
ck = Nonedef getInfo():while True:data = ck.recv(1024)#用于接受服务其发送的信息#接收消息时同步获取系统时间并显示在消息显示框上text.insert(tkinter.INSERT, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\n')text.insert(tkinter.INSERT, data.decode("utf-8"))def connectServer():global ck#全局ipStr = eip.get()portStr = eport.get()userStr = euser.get()client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4相关协议client.connect((ipStr, int(portStr)))#连接服务器client.send(userStr.encode("utf-8"))#将自己的登录名发送给服务器,函数会附带自己的IP信息ck = clientt = threading.Thread(target=getInfo)t.start()def sendMail():friend = Nonefriend = efriend.get()sendStr = esend.get()#自己发出的消息服务器不会重发会给自己,所以在客户端定义界面显示自己发送的消息if friend !="":text.insert(tkinter.INSERT, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\n'+'我对'+friend+'说:' + sendStr+'\n')else:text.insert(tkinter.INSERT, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\n'+'我(群发)说:' + sendStr+'\n')#将消息发给服务器,添加“:”分割是要方便服务器端用正则表达式分出要发送的用户名和要发送的消息sendStr = friend + ":" + sendStr+"\n"ck.send(sendStr.encode("utf-8"))def Exit():#我在服务器端定义了接收到“exit”就判定该用户下线,并删掉该用户的资料sendStr = "exit" + ":" + ""ck.send(sendStr.encode("utf-8"))text.insert(tkinter.INSERT, "您已下线,如需接收信息请重新登录。\n")#下面是界面
labelUse = tkinter.Label(win, text="userName").grid(row=0, column=0)
euser = tkinter.Variable()
entryUser = tkinter.Entry(win, textvariable=euser).grid(row=0, column=1)labelIp = tkinter.Label(win, text="服务器ip").grid(row=1, column=0)
eip = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable=eip).grid(row=1, column=1)labelPort = tkinter.Label(win, text="port").grid(row=2, column=0)
eport = tkinter.Variable()
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=2, column=1)button = tkinter.Button(win, text="登录", command=connectServer).grid(row=0, column=2)text = tkinter.Text(win, height=10, width=40)
labeltext= tkinter.Label(win, text="显示消息").grid(row=4, column=0)
text.grid(row=4, column=1)esend = tkinter.Variable()
labelesend = tkinter.Label(win, text="发送的消息").grid(row=5, column=0)
entrySend = tkinter.Entry(win, textvariable=esend).grid(row=5, column=1)efriend = tkinter.Variable()
labelefriend= tkinter.Label(win, text="发给谁").grid(row=6, column=0)
entryFriend = tkinter.Entry(win, textvariable=efriend).grid(row=6, column=1)button2 = tkinter.Button(win, text="发送", command=sendMail).grid(row=6, column=2)
button2 = tkinter.Button(win, text="下线", command=Exit).grid(row=2, column=2)
win.mainloop()

服务器server:

# -*- coding: utf-8 -*-
"""
Created on Tue May 12 23:46:03 2020@author: LENOVO
"""import tkinter
import socket, threadingwin = tkinter.Tk()  # 创建主窗口
win.title('服务器')
win.geometry("400x300+200+20")
users = {}#用户字典,也可以连接数据库def run(connect, addrss):
#接收客户端登陆的信息userName = connect.recv(1024)
#解码并储存用户的信息users[userName.decode("utf-8")] = connect
#在连接显示框中显示是否连接成功printStr = "" + userName.decode("utf-8") + "连接\n"text.insert(tkinter.INSERT, printStr)
#向当前登录的客户端反馈登录信息并提供在线用户列表printStr ="登录成功!\n"+"当前在线的好友有:"+str(list(users.keys()))+"\n"connect.send(printStr.encode())
#向所有在线的客户端反馈新的好友登录信息并提供在线用户列表printStr = userName.decode("utf-8") + "已上线\n"+"当前在线的好友有:"+str(list(users.keys()))+"\n"for key in users:if key !=userName.decode("utf-8"):users[key].send(printStr.encode())
#接受客户端发送的信息while True:rData = connect.recv(1024) dataStr = rData.decode("utf-8")
#分割字符串得到所要发送的用户名和客户端所发送的信息infolist = dataStr.split(":")
#通过客户端要发送的信息中是否指定要发送到的用户,如果没有选择要发送的用户,则默认为群发消息if infolist[0] == "" :   for key in users:        if key !=userName.decode("utf-8"):users[key].send((userName.decode("utf-8") + "说(群发):" + infolist[1]).encode("utf"))
#如果接收到的消息为客户端退出函数发送的“exit”则删掉该用户在users字典中的信息,并通知其他用户该用户已下线elif infolist[0] == "exit":del users[userName.decode("utf-8")]#删掉该用户信息printStr = "" + userName.decode("utf-8") + "下线\n"text.insert(tkinter.INSERT, printStr)for key in users:printStr = userName.decode("utf-8") + "已下线\n"+"当前在线的好友有:"+str(list(users.keys()))+"\n"users[key].send(printStr.encode())#要发送信息的客户端向目标客户端发送信息        else:      if infolist[0] in users:users[infolist[0]].send((userName.decode("utf-8") + "说(私聊):" + infolist[1]).encode("utf"))else:printStr =infolist[0]+"不在线,上条消息未发出"+"\n"connect.send(printStr.encode())#界面启动按钮连接的函数
def startSever():
#启用一个线程开启服务器s = threading.Thread(target=start) s.start()
#开启线程def start():
#从输入端中获取ip和端口号ipStr = eip.get()portStr = eport.get()
# socket嵌套字TCP的ipv4和相关协议server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定ip和端口号server.bind((ipStr, int(portStr)))
#设置监听和连接的最大的数量server.listen(10)
#服务器启动信息显示在信息窗口中printStr = "服务器启动成功!\n" text.insert(tkinter.INSERT, printStr)
#模拟服务器要一直运行所以使用死循环while True:
#接受所连接的客户端的信息connect, addrss = server.accept()
#每连接一个客户端就开启一个线程t = threading.Thread(target=run, args=(connect, addrss))t.start()#下面是关于界面的操作
labelIp = tkinter.Label(win, text='ip').grid(row=0, column=0)
eip = tkinter.Variable()labelPort = tkinter.Label(win, text='port').grid(row=1, column=0)
eport = tkinter.Variable()entryIp = tkinter.Entry(win, textvariable=eip).grid(row=0, column=1)
entryPort = tkinter.Entry(win, textvariable=eport).grid(row=1, column=1)
button = tkinter.Button(win, text="启动", command=startSever).grid(row=1, column=2)
text = tkinter.Text(win, height=15, width=40)
labeltext = tkinter.Label(win, text='连接消息').grid(row=3, column=0)
text.grid(row=3, column=1)win.mainloop()

开启后界面效果:(这里开启一个服务器和三个客户端)

登陆
群聊
私聊
用户下线
参考文章实现了多用户私聊,奠定了框架基础,其本文链接:
https://blog.csdn.net/qq_41682681/article/details/80939682

基于TCP协议网上聊天程序(python)带界面相关推荐

  1. 计算机网络课程设计--基于TCP协议网上聊天程序--python实现带图形界面--socket--多线程

                                              基于TCP协议网上聊天程序 引言 21世纪是一个以网络为核心的信息时代,要实现信息化,就必须依靠完善的网络.而随着计 ...

  2. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

  3. java tcp聊天程序_java实现基于Tcp的socket聊天程序

    对于步入编程行业不深的初学者或是已经有所领会的人来说,当学习一项新的技术的时候,非常渴望有一个附上注释完整的Demo.本人深有体会,网上的例子多到是很多,但是很杂不完整,写代码这种东西来不得半点马虎, ...

  4. Java案例:基于TCP的简单聊天程序

    文章目录 一.如何实现TCP通信 二.编写C/S架构聊天程序 (一)编写服务器端程序 - Server.java (二)编写客户端程序 - Client.java (三)测试服务器端与客户端能否通信 ...

  5. 基于TCP的在线聊天程序

    在线聊天服务端 import tkinter import tkinter.font as tkFont import socket import threading import time impo ...

  6. Java实验:编写网络聊天程序(图形界面)

    课程名称 高级Java程序设计 实验项目 Java网络编程 实验目的: 使用客户机/服务器模式.基于TCP协议编写一对多"群聊"程序.其中客户机端单击"连接服务器&quo ...

  7. python实现淘宝客服自动回复语_Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例...

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些 ...

  8. 网络编程应用:基于TCP协议【实现一个聊天程序】

    要求: 基于TCP协议实现一个聊天程序,客户端发送一条数据,服务器端发送一条数据 客户端代码: package Homework1;import java.io.IOException; import ...

  9. 基于TCP协议RSA与Base64加密的聊天程序

    一.理论依据 1.TCP协议 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.其中TCP提供IP环境下的数据可靠 ...

最新文章

  1. windows2008下VS2008发布失败
  2. 作业调度算法--高响应比优先 操作系统_处理器管理_编程题
  3. Chrome浏览器官方离线安装包下载
  4. 使用组件化开发思路替换 SAP Spartacus 的 Logo
  5. Linux内核设计与实现 总结笔记(第五章)系统调用
  6. linux系统下安装两个或多个tomcat
  7. Mysql CONCAT FIND_IN_SET用法
  8. 搭建服务器处理系统(基于netty),基于Netty的农业物联网服务器系统设计.PDF
  9. ElmentUI数据表格 序号
  10. 百度地图android去除logo,百度地图 Android版 隐藏logo
  11. Marshmallow 实现序列化和反序列化
  12. hibernate之多对多映射操作中间表
  13. 因果推断 | 因果关系推断-系列电子书资源
  14. python批量分析表格_python批量设置多个Excel文件页眉页脚的脚本
  15. 某预约系统分析 某区公共自行车租车卡在线预约,关于如何提高成功概率
  16. Flutter第一部分(UI)第五篇:为Widget添加交互
  17. IPerf3 for Android 7
  18. CentOS7硬盘扩容
  19. Maven插件-打包时多环境配置文件设置
  20. Linux小技巧scp命令

热门文章

  1. CSS把图片设置为背景
  2. 银行手续费收取标准,你知道吗
  3. GitHub免费开放所有核心功能;告别纸币-央行牵头数字货币
  4. 无法登录苹果开发者_苹果企业开发者账号怎么申请?失败的原因是什么
  5. (信贷风控十五)评分卡分数切分、授信额度与利率定价
  6. SPLAYER中文字幕乱码
  7. 罗马数字到底是怎么组成的(内容详细)
  8. 雅高集团2021年即将开业的新酒店数量强劲增长
  9. amax服务器安装双系统,双系统安装MAX OS X LION的方法
  10. Elasticsearch数据库all shards failed