基于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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。