设为首页 收藏本站
查看: 871|回复: 0

[经验分享] Python在线聊天

[复制链接]

尚未签到

发表于 2017-4-23 06:15:14 | 显示全部楼层 |阅读模式
  发布一个用Python实现的一个在线聊天,主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点:
  1.Python Socket;
2.Python Tkinter库。
  当然也应该了解如下的基础知识:
1.Python基本语法;
2.Python基本语句;
3.Python函数;
4.Python模块;
5.Python异常处理;
6.Python面向对象;
  7.Python线程等相关知识。
  另外:我使用的是Python2.5这个版本,如果你使用的Python3.0,可能不兼容。 推荐使用稳定的2.5版,linux系统默认安装的也是2.5这个版本,许多第三方库也是使用2.5这个版本。
  下面是这个小东西的一个截图:
DSC0000.png
 
  下面是服务器端代码:

# _*_ coding:utf-8 _*_
# Filename:ServerUI.py
# Python在线聊天服务器端
import Tkinter
import tkFont
import socket
import thread
import time
import sys
class ServerUI():
title = 'Python在线聊天-服务器端V1.0'
local = '127.0.0.1'
port = 8808
global serverSock;
flag = False
#初始化类的相关属性,类似于Java的构造方法
def __init__(self):
self.root = Tkinter.Tk()
self.root.title(self.title)
#窗口面板,用4个frame面板布局
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.set
self.chatText.pack(expand=1,fill=Tkinter.BOTH)
self.chatTextScrollBar['command'] = self.chatText.yview()
self.frame[0].pack(expand=1,fill=Tkinter.BOTH)
#标签,分开消息显示Text和消息输入Text
label = Tkinter.Label(self.frame[1],height=2)
label.pack(fill=Tkinter.BOTH)
self.frame[1].pack(expand=1,fill=Tkinter.BOTH)
#输入消息Text的滚动条
self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
#输入消息Text,并与滚动条绑定
ft = tkFont.Font(family='Fixdsys',size=11)
self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand=1,fill=Tkinter.BOTH)
self.inputTextScrollBar['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 = 1024
self.chatText.insert(Tkinter.END,'服务器已经就绪......')
#循环接受客户端的连接请求
while True:
self.connection,self.address = self.serverSock.accept()
self.flag = True
while True:
#接收客户端发送的消息
self.cientMsg = self.connection.recv(self.buffer)
if not self.cientMsg:
continue
elif self.cientMsg == 'Y':
self.chatText.insert(Tkinter.END,'服务器端已经与客户端建立连接......')
self.connection.send('Y')
elif self.cientMsg == 'N':
self.chatText.insert(Tkinter.END,'服务器端与客户端建立连接失败......')
self.connection.send('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)
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):
#启动一个新线程来接收客户端的消息
#thread.start_new_thread(function,args[,kwargs])函数原型,
#其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
#receiveMessage函数不需要参数,就传一个空元组
thread.start_new_thread(self.receiveMessage,())
def main():
server = ServerUI()
server.startNewThread()
server.root.mainloop()
if __name__=='__main__':
main()

  下面是客户端代码:

# _*_ coding:utf-8 _*_
# Filename:ClientUI.py
# Python在线聊天客户端
import Tkinter
import tkFont
import socket
import thread
import time
import sys
class ClientUI():
title = 'Python在线聊天-客户端V1.0'
local = '127.0.0.1'
port = 8808
global clientSock;
flag = False
#初始化类的相关属性,类似于Java的构造方法
def __init__(self):
self.root = Tkinter.Tk()
self.root.title(self.title)
#窗口面板,用4个面板布局
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.set
self.chatText.pack(expand=1,fill=Tkinter.BOTH)
self.chatTextScrollBar['command'] = self.chatText.yview()
self.frame[0].pack(expand=1,fill=Tkinter.BOTH)
#标签,分开消息显示Text和消息输入Text
label = Tkinter.Label(self.frame[1],height=2)
label.pack(fill=Tkinter.BOTH)
self.frame[1].pack(expand=1,fill=Tkinter.BOTH)
#输入消息Text的滚动条
self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
#输入消息Text,并与滚动条绑定
ft = tkFont.Font(family='Fixdsys',size=11)
self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand=1,fill=Tkinter.BOTH)
self.inputTextScrollBar['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=15,pady=8)
#关闭按钮
self.closeButton=Tkinter.Button(self.frame[3],text=' 关 闭 ',width=10,command=self.close)
self.closeButton.pack(expand=1,side=Tkinter.RIGHT,padx=15,pady=8)
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 = True
except:
self.flag = False
self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,请检查服务器端是否已经启动')
return
self.buffer = 1024
self.clientSock.send('Y')
while True:
try:
if self.flag == True:
#连接建立,接收服务器端消息
self.serverMsg = self.clientSock.recv(self.buffer)
if self.serverMsg == 'Y':
self.chatText.insert(Tkinter.END,'客户端已经与服务器端建立连接......')
elif self.serverMsg == 'N':
self.chatText.insert(Tkinter.END,'客户端与服务器端建立连接失败......')
elif not self.serverMsg:
continue
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.serverMsg)
else:
break
except EOFError, msg:
raise msg
self.clientSock.close()
break
#发送消息
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.clientSock.send(message);
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):
#启动一个新线程来接收服务器端的消息
#thread.start_new_thread(function,args[,kwargs])函数原型,
#其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
#receiveMessage函数不需要参数,就传一个空元组
thread.start_new_thread(self.receiveMessage,())
def main():
client = ClientUI()
client.startNewThread()
client.root.mainloop()
if __name__=='__main__':
main()

  上面的代码基本上都是有注释的,是容易阅读的,这个程序比较简陋,但记住动手写才是非常重要的。 
  另外直接拷贝上面的代码,有可能需要你排版一下格式,因为Python语言都是用缩进来区分语句块的。
  Python这种语言简单并且功能强大,第三方支持的类库也很丰富,开发起来效率确实很高,据说使用Python web框架Django能用一星期开发出一个网站,感觉真是比较神奇呀。
  一个Java技术交流群,一起交流,共同进步,扣扣群号:513086638

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-367908-1-1.html 上篇帖子: Python编程语言大总结 下篇帖子: python应用领域介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表