基于TCP的在线聊天程序

在线聊天服务端

import tkinter
import tkinter.font as tkFont
import socket
import threading
import time
import sys
class ServerUI():local='127.0.0.1'port=5505global serverSock;flag=Falsedef __init__(self):self.root=tkinter.Tk()self.root.title('在线聊天-服务端v1.0')self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)ft=tkFont.Font(family='Fixdsys',size=11)self.chatText=tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)self.chatText['yscrollcommand']=self.chatTextScrollBar.setself.chatText.pack(expand=1,fill=tkinter.BOTH)self.chatTextScrollBar['command']=self.chatText.yview()self.frame[0].pack(expand=1,fill=tkinter.BOTH)label=tkinter.Label(self.frame[1],height=2)label.pack(fill=tkinter.BOTH)self.frame[1].pack(expand=1,fill=tkinter.BOTH)#输入消息text的滚动条self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#输入消息并与滚动条绑定ft=tkFont.Font(family='Fixdsys',size=11)self.inputText=tkinter.Text(self.frame[2],width=70,height=8,font=ft)self.inputText['yscrollcommand']=self.inputTextScorllBar.setself.inputText.pack(expand=1,fill=tkinter.BOTH)self.inputTextScorllBar['command']=self.chatText.yview()self.frame[2].pack(expand=1,fill=tkinter.BOTH)#发送按钮self.sendButton=tkinter.Button(self.frame[3],text='发送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#关闭按钮self.closeButton=tkinter.Button(self.frame[3],text='关闭', width=10,command=self.close)self.closeButton.pack(expand=1,side=tkinter.RIGHT,padx=25,pady=5)self.frame[3].pack(expand=1,fill=tkinter.BOTH)#接收消息def receiveMessage(self) :#建立 Socket 连接self.serverSock=socket.socket(socket.AF_INET ,socket.SOCK_STREAM)self.serverSock.bind((self.local, self.port))self.serverSock.listen(15)self.buffer=1024self.chatText.insert(tkinter.END ,'服务器已经就绪 ......')#循环接受客户端的连接请求while True:self.connection,self.address=self.serverSock.accept()self.flag=Truewhile True :#接收客户端发送的消息self.cientMsg=self.connection.recv(self.buffer).decode('utf-8')if not self.cientMsg:continueelif self.cientMsg=='Y':self.chatText.insert(tkinter.END ,'服务器端己经与客户端建立连接 .....')self.connection.send(b'Y')elif self.cientMsg=='N':self.chatText.insert(tkinter.END ,'服务器端与客户端建立连接失败 .....')self.connection.send(b'N')else :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'客户端'+ theTime +'说: \n')self.chatText.insert(tkinter.END ,' '+ self.cientMsg)#发送消息def sendMessage(self):#得到用户在 Text 中输入的消息message=self.inputText.get ('1.0',tkinter.END)#格式化当前的时间theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服务器' + theTime + '说: \n')self.chatText.insert(tkinter.END,' '+message +'\n')if self.flag==True :#将消息发送到客户端
            self.connection.send(message.encode())else:#Socket 连接没有建立,提示用户self.chatText.insert(tkinter.END,'您还未与客户端建立连接,客户端无法接收你的消息\n')#清空用户在Text中输入的消息self.inputText.delete(0.0,message.__len__()-1.0)#关闭消息窗口并退出def close(self):sys.exit()#启动线程接收客户端的消息def startNewThread(self) :#启动一个新线程来接收客户端的消息#args是传递给线程函数的参数 receiveMessage 函数不需要参数,只传一个空元组thread=threading.Thread(target=self.receiveMessage,args=())thread.setDaemon(True);thread.start();def main():server=ServerUI()server.startNewThread()server.root.mainloop()if __name__ == '__main__':main()

在线聊天客户端

import tkinter
import tkinter.font as tkFont
import socket
import threading
import time,sys
class ClientUI():local='127.0.0.1'port=5505global clientSock;flag=False#初始化类的相关属性的构造函数def __init__(self):self.root=tkinter.Tk()self.root.title('在线聊天-客户端v1.0')#窗口面板,用四个面板布局self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]#显示消息Text右边的滚动条self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#显示消息Text,并绑定上面的滚动条ft=tkFont.Font(family='Fixdsys',size=11)self.chatText=tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)self.chatText['yscrollcommand']=self.chatTextScrollBar.setself.chatText.pack(expand=1,fill=tkinter.BOTH)self.chatTextScrollBar['command']=self.chatText.yview()self.frame[0].pack(expand=1,fill=tkinter.BOTH)#标签,分开消息显示Text和消息输入Textlabel=tkinter.Label(self.frame[1],height=2)label.pack(fill=tkinter.BOTH)self.frame[1].pack(expand=1,fill=tkinter.BOTH)#输入消息text的滚动条self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#输入消息并与滚动条绑定ft=tkFont.Font(family='Fixdsys',size=11)self.inputText=tkinter.Text(self.frame[2],width=70,height=8,font=ft)self.inputText['yscrollcommand']=self.inputTextScorllBar.setself.inputText.pack(expand=1,fill=tkinter.BOTH)self.inputTextScorllBar['command']=self.chatText.yview()self.frame[2].pack(expand=1,fill=tkinter.BOTH)#发送按钮self.sendButton=tkinter.Button(self.frame[3],text='发送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#关闭按钮self.closeButton=tkinter.Button(self.frame[3],text='关闭', width=10,command=self.close)self.closeButton.pack(expand=1,side=tkinter.RIGHT,padx=25,pady=5)self.frame[3].pack(expand=1,fill=tkinter.BOTH)#接收消息def receiveMessage(self) :try:#建立 Socket 连接self.clientSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.clientSock.connect((self.local,self.port))self.flag=Trueexcept:self.flag=Falseself.chatText.insert(tkinter.END,'您还未与客户端建立连接,请检查服务器是否启动......')returnself.buffer=1024self.clientSock.send('Y'.encode())#向服务器发送字符'Y',表示客户端要连接服务器while True:try:if self.flag==True:#连接建立,接受服务器端消息self.serverMsg=self.clientSock.recv(self.buffer).decode('utf-8')if self.serverMsg=='Y':self.chatText.insert(tkinter.END ,'客户端己经与服务端建立连接 .....')elif self.serverMsg=='N':self.chatText.insert(tkinter.END ,'客户端端与服务端建立连接失败 .....')elif not self.serverMsg:continueelse :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服务端' + theTime + '说: \n')self.chatText.insert(tkinter.END ,' ' + self.serverMsg)else:breakexcept EOFError as msg:raise msgself.clientSock.close()breakdef sendMessage(self) :#得到用户在 Text 中输入的消息message=self.inputText.get ('1.0',tkinter.END)#格式化当前的时间theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END,'客户端'+ theTime +'说: \n')self.chatText.insert(tkinter.END,' '+message+'\n')if self.flag==True:#将消息发送到服务端
            self.clientSock.send(message.encode())else:#Socket 连接没有建立,提示用户self.chatText.insert(tkinter.END,'您还未与服务端建立连接,客户端无法接收你的消息\n')#清空用户在Text中输入的消息self.inputText.delete(0.0,message.__len__()-1.0)#关闭消息窗口并退出def close(self):sys.exit()#启动线程接收客户端的消息def startNewThread(self) :#启动一个新线程来接收客户端的消息#args是传递给线程函数的参数receiveMessage 函数不需要参数,只传一个空元组thread=threading.Thread(target=self.receiveMessage,args=())thread.setDaemon(True);thread.start();
def main() :client=ClientUI()client.startNewThread()client.root.mainloop()if __name__ == '__main__':main()

 

 

转载于:https://www.cnblogs.com/jzxs/p/11166180.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装Confluence

Docker安装Confluence 参考链接: https://my.oschina.net/u/2289161/blog/1648587 https://hub.docker.com/r/cptactionhank/atlassian-confluence/dockerfile https://my.oschina.net/u/2289161/blog/1647061 https://my.oschina.net/u/2289161/blog/838218 https://hub.…

安卓开发基础面试题,Android面试必备的集合源码详解,附小技巧

去年无疑是 Flutter 技术如火如荼发展的一年。 每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探…

『算法』读书笔记 1.4算法分析 Part1

Chapter 1 本章结构 1.1Java语法 1.2数据抽象 1.3集合类抽象数据类型:背包 (Bags) 、队列 (Queues) 、栈 (Stacks) 1.4算法分析 1.5连通性问题-Case Study: Union - Find ADT 本节开篇使用了一个ThreeSum程序进行示例: ThreeSum所起到的作用…

安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己

写在前面 身边有不少去大厂面试的朋友,其中小金面试字节跳动的经历很有意义,在这里分享给大家。小金是末流211计算机专业大三本科生,前几天面试了字节跳动的广州Android开发实习生。下面是他的面试经历,还有一些他自己的经验。 …

安卓开发必须会的技能!浅谈Android消息机制原理,威力加强版

目录 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。 PagerAdapter 介绍ViwePager 缓存策略ViewPager 布局处理ViewPager 事件处理相关内容 Android 基础 1.Activity 1、 什么是 Activi…

NuGet 无法连接到远程服务器-解决方法(转)

原地址: http://www.lixin.me/blog/2012/03/01/29362 今天打开NuGet的Manage NuGet Packages,显示“无法连接到远程服务器”。打开Setting-》Package Manager-》Package Sources。看到里面有一个源:https://go.microsoft.com/fwlink/?LinkID…

安卓开发面试书籍,全世界都在问Android开发凉了吗?建议收藏

前言 本想今年辞掉工作大干一场,没想到碰到疫情,家里蹲了3个月…,还好字节能给一次机会。前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州…

杭州集训Day5

下面是Day5的题目!(其实都咕了好几天了 1007040210. T1 皇后 XY 的疑难 (1s 512MB) 1.1 题目描述有一个n*n的王国城堡地图上,皇后XY喜欢看骑士之间的战斗,于是他准备布置m个骑士,其中每一个骑士都可以向8个方向&#x…

安卓开发面试书籍,每个程序员都必须掌握的8种数据结构!面试必会

前言 本篇文章主要记录分享我的面试准备过程。 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话“要么钱没给到位,要么心委屈了”,想必大家耳熟能详了,我这里再细说一下我个人离职原因: 工资倒挂&#xf…

使用thinkPHP做注册程序的实例

登录界面&#xff1a; 数据库和数据表的结构 具体的操作步骤如下&#xff1a; 第一步&#xff1a;入口文件index.php内容 (此文件基本是属于固定的格式&#xff09; <?phpdefine(THINK_PATH,./ThinkPHP/);define(APP_NAME,MyApp);define(APP_PAHT,./MyApp/);require_once T…

安卓开发面试技能介绍,来一份全面的面试宝典练练手,不吃透都对不起自己

前言 网上有很多对程序员简历的一些指导&#xff0c;这里就不重述&#xff0c;大家可以搜下网上其他大神的总结&#xff0c;结合自身情况修改下。我有几点建议&#xff1a; 1.尽量不要花哨&#xff0c;程序员和设计师或者产品运营还不一样&#xff0c;我们的简历成功与否决定…

安卓开发面试题及答案,一次哔哩哔哩面试经历,年薪50W

没有稳定的工作&#xff0c;只有稳定的能力。 又到了万物复苏的季节&#xff0c;在程序猿这个行当里&#xff0c;作为 Android 开发出生的&#xff0c;在经历了八年的脱发生涯后&#xff0c;有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起&#xff0c;在 ReactNati…

安卓开发面试题!带着问题深入学习Handler,进阶学习资料!

进大厂本来就很难了&#xff0c;不过做足了准备&#xff0c;你会发现很多问题都迎刃而解了&#xff0c;当然有时候运气也占了一部分&#xff0c;除了运气以外&#xff0c;当然与我自身的努力也是分不开的。运气也是实力的一部分&#xff0c;毕竟天助自助者~ 每次到年底做总结的…

VueJS教程3

目录 13、Vue实例 13.1 动态组件&#xff08;Tab切换、简化版留言板&#xff09;13.2 使用Vue开发TodoList14、Vue CLI14.1 使用vue-cli开发TodoList接着VueJS教程2。 13、Vue实例 13.1 动态组件&#xff08;Tab切换、简化版留言板&#xff09; 参考&#xff1a;https://vuejs.…

春招我借这份PDF的复习思路,论程序员成长的正确姿势

一. 开发背景 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 面试总结 面试大厂一定要做好充分的准备&#xff0c;没有准备就去面试完全是去当炮灰的&#xff0c;更是对自己的不负责。再…

T-SQL语句学习(三)

这部分介绍下视图、索引技术。 1、视图&#xff1a;是从一个或几个基本表&#xff08;或视图&#xff09;导出表。视图与基本表不同&#xff0c;是一个虚表。 当基本表中的数据发生变化时&#xff0c;从视图中查询出来的数据也会随之改变。 1.1 定义视图 a、创建视图的语法要求…

普通二本的辛酸Android面试之路,满满干货指导

一、自我介绍 应该算是起点比较高吧&#xff01;985大学毕业后面一直在国外读研。之前准备面试微软但是可能经验不够&#xff0c;没有通过。经过朋友介绍我准备回国&#xff0c;积累一些开发经验。于是我面试了国内大厂BATJ&#xff0c;还有一些其他比较知名的公司&#xff0c…

普通二本的辛酸Android面试之路,算法太TM重要了

前言 编程是一个江湖&#xff0c;江湖之大&#xff0c;鱼龙混杂&#xff0c;一部分江湖人士乃虾兵蟹将&#xff0c;一不小心就被一箭射死&#xff0c;我们称之为“码农”&#xff0c;这些人事江湖的重要组成部分&#xff0c;他们承担着堆砌代码&#xff0c;实现功能设计的使命…

SQL常用日期处理函数(转)

/**datepart()函数的使用 * datepart()函数可以方便的取到时期中的各个部分*如日期&#xff1a;2006-07--02 18&#xff1a;15&#xff1a;36.513* yy:取年 2006* mm:取月 7* dd:取月中的天 2* dy:取年中的天 183* wk:取…

最全的BAT大厂面试题整理,系列篇

前言 看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了&#xff0c;但是中高级的Android技术人才仍然稀缺“&#xff0c;这的确不假&#xff0c;从我在百度所进行的一些面试来看&#xff0c;找一个适合的高级Android工程师的确不容易&#xff0c;一般需要进行大…