基于python3的socket聊天编程
本文实例为大家分享了基于python3的socket聊天编程,供大家参考,具体内容如下
阶段一:最简易的聊天系统
缺点:程序不够完善,只能一来一回,且没人每次只能说一句话
server端:
importsocket HostPort=('127.0.0.1',9999) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(HostPort) s.listen(1) conn,addr=s.accept() #print('Connectingby:%s'%addr) while1: data=conn.recv(1024).decode() print(data) user_input=input('>>>') conn.send(user_input.encode('utf8')) #conn.close() s.close()
client端:
importsocket hostport=('127.0.0.1',9999) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(hostport) while1: user_input=input('>>>').strip() s.send(user_input.encode('utf-8')) iflen(user_input)==0: continue ifuser_input=='quit': s.close() break server_reply=s.recv(1024).decode() print(server_reply)
注意事项:在python3中,bytes和str是两个不同的概念,send和recv的数据都是bytes,而str转化成bytes是通过encode('utf8')实现,bytes转化成str,是通过decode()实现;
在该阶段,服务十分不稳定,经常会断开,所以有下一个阶段,且每人每次可以发送多条消息;
阶段二 多线程并发聊天系统
在阶段一中,服务器端和客户的通信只能一发一收,不能实现服务器端和客户端双方的自由消息发送,所以,我们引用多线程,我们将消息的接收单独开一个线程,这样便可以服务器端和客户端实现同时发送多条消息,并不影响接收;
开始上代码:
server端:
importsocket importthreading#导入多线程模块 print("Waittingtobeconnected......") HostPort=('127.0.0.1',9999) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建socket实例 s.bind(HostPort) s.listen(1) conn,addr=s.accept() true=True addr=str(addr) print('Connectingby:%s'%addr) defReceve(conn):#将接收定义成一个函数 globaltrue#声明全局变量,当接收到的消息为quit时,则触发全局变量true=False,则会将socket关闭 whiletrue: data=conn.recv(1024).decode('utf8') ifdata=='quit': true=False print("youhavereceve:"+data+"from"+addr)#当接收的值为'quit'时,退出接收线程,否则,循环接收并打印 thrd=threading.Thread(target=Receve,args=(conn,))#线程实例化,target为方法,args为方法的参数 thrd.start()#启动线程 whiletrue: user_input=input('>>>') conn.send(user_input.encode('utf8'))#循环发送消息 ifuser_input=='quit':#当发送为‘quit'时,关闭socket true=False #conn.close() s.close()
client端
importsocket importthreading hostport=('127.0.0.1',9999) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(hostport) true=True defReceve(s): globaltrue whiletrue: data=s.recv(1024).decode('utf8') ifdata=='quit': true=False print('recevienews:\033[5;37;46m%s\033[0m'%data) thrd=threading.Thread(target=Receve,args=(s,)) thrd.start() whiletrue: user_input=input('>>>') s.send(user_input.encode('utf8')) ifuser_input=='quit': true=False s.close()
效果展示(紫色字体为接收消息,白色字体为发送消息,双方任意一方输入'quit',即可退出)
1、服务器端:(原来只能服务器端先接收消息后才能发送消息,现在没有这种限制,可以随时主动发送)
2、客户端
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。