时间:2020-07-29 python教程 查看: 916
本文实例为大家分享了基于python3的socket聊天编程,供大家参考,具体内容如下
阶段一:最简易的聊天系统
缺点:程序不够完善,只能一来一回,且没人每次只能说一句话
server端:
import socket
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('Connecting by : %s ' % addr)
while 1:
data = conn.recv(1024).decode()
print (data)
user_input = input('>>>')
conn.send(user_input.encode('utf8'))
#conn.close()
s.close()
client端:
import socket
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)
while 1:
user_input = input('>>> ').strip()
s.send(user_input.encode('utf-8'))
if len(user_input) == 0:
continue
if user_input == 'quit':
s.close()
break
server_reply = s.recv(1024).decode()
print (server_reply)
注意事项:在python 3中,bytes和str是两个不同的概念,send和recv的数据都是bytes,而str转化成bytes是通过encode('utf8')实现,bytes转化成str,是通过decode()实现;
在该阶段,服务十分不稳定,经常会断开,所以有下一个阶段,且每人每次可以发送多条消息;
阶段二 多线程并发聊天系统
在阶段一中,服务器端和客户的通信只能一发一收,不能实现服务器端和客户端双方的自由消息发送,所以,我们引用多线程,我们将消息的接收单独开一个线程,这样便可以服务器端和客户端实现同时发送多条消息,并不影响接收;
开始上代码:
server端:
import socket
import threading # 导入多线程模块
print("Waitting to be connected......")
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('Connecting by : %s ' %addr )
def Receve(conn): # 将接收定义成一个函数
global true # 声明全局变量,当接收到的消息为quit时,则触发全局变量 true = False,则会将socket关闭
while true:
data = conn.recv(1024).decode('utf8')
if data == 'quit':
true=False
print("you have receve: "+data+" from"+addr) # 当接收的值为'quit'时,退出接收线程,否则,循环接收并打印
thrd=threading.Thread(target=Receve,args=(conn,)) # 线程实例化,target为方法,args为方法的参数
thrd.start() # 启动线程
while true:
user_input = input('>>>')
conn.send(user_input.encode('utf8')) # 循环发送消息
if user_input == 'quit': # 当发送为‘quit'时,关闭socket
true = False
#conn.close()
s.close()
client 端
import socket
import threading
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)
true = True
def Receve(s):
global true
while true:
data = s.recv(1024).decode('utf8')
if data == 'quit':
true = False
print('recevie news:\033[5;37;46m%s\033[0m' % data )
thrd=threading.Thread(target=Receve,args=(s,))
thrd.start()
while true:
user_input = input('>>>')
s.send(user_input.encode('utf8'))
if user_input == 'quit':
true = False
s.close()
效果展示(紫色字体为接收消息,白色字体为发送消息,双方任意一方输入'quit',即可退出)
1、服务器端:(原来只能服务器端先接收消息后才能发送消息,现在没有这种限制,可以随时主动发送)
2、客户端
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持python博客。