基于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模块学习 filecmp 文件比较
Aug 27 Python
Python中文件遍历的两种方法
Jun 16 Python
Python实现的简单算术游戏实例
May 26 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
python操作oracle的完整教程分享
Jan 30 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
python反转列表的三种方式解析
Nov 08 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 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
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
Django接受前端数据的几种方法总结
2016/11/04 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python中requests和https使用简单示例
2018/01/18 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python读取与处理netcdf数据方式
2020/02/14 Python
利用python生成照片墙的示例代码
2020/04/09 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
python如何求圆的面积
2020/07/01 Python
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
会计专业应届生求职信
2013/11/24 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
机关搬迁方案
2014/05/18 职场文书
学校标语口号大全
2015/12/26 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js