您的位置:首页 > 编程语言 > Python开发

基于python3的socket聊天编程

2020-02-17 21:05 686 查看

本文实例为大家分享了基于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、客户端     

以上就是本文的全部内容,希望对大家的学习有所帮助

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python3 socket 聊天