基于python3的socket聊天编程


Posted in Python onFebruary 17, 2020

本文实例为大家分享了基于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、服务器端:(原来只能服务器端先接收消息后才能发送消息,现在没有这种限制,可以随时主动发送)

基于python3的socket聊天编程

2、客户端     

基于python3的socket聊天编程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过pil模块获得图片exif信息的方法
Mar 16 Python
Python numpy 常用函数总结
Dec 07 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
Django中的ajax请求
Oct 19 Python
python3使用matplotlib绘制条形图
Mar 25 Python
Python和Sublime整合过程图示
Dec 25 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 #Python
python词云库wordcloud的使用方法与实例详解
Feb 17 #Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 #Python
Python基于Socket实现简单聊天室
Feb 17 #Python
TFRecord文件查看包含的所有Features代码
Feb 17 #Python
tensorflow之tf.record实现存浮点数数组
Feb 17 #Python
Python读取表格类型文件代码实例
Feb 17 #Python
You might like
基于mysql的论坛(2)
2006/10/09 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php mysql数据库操作分页类
2008/06/04 PHP
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP积分兑换接口实例
2015/02/09 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
Python单例模式的四种创建方式实例解析
2020/03/04 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
python如何将图片转换素描画
2020/09/08 Python
python 利用toapi库自动生成api
2020/10/19 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
护理学专业推荐信
2013/12/03 职场文书
护士检查书
2014/01/17 职场文书
食品安全宣传标语
2014/06/07 职场文书
群众路线剖析材料
2014/09/30 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
《水上飞机》教学反思
2016/02/20 职场文书