基于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计算时间差的方法
May 20 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
详解Django 时间与时区设置问题
Jul 23 Python
python for循环remove同一个list过程解析
Aug 14 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
Python数据正态性检验实现过程
Apr 18 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
python上下文管理的使用场景实例讲解
Mar 03 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中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
php输入流php://input使用浅析
2014/09/02 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
setTimeout学习小结
2017/02/08 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
文秘专业自荐信
2013/10/14 职场文书
资料员的岗位职责
2013/11/20 职场文书
安全生产责任书
2014/03/12 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
mysql知识点整理
2021/04/05 MySQL
新手入门Mysql--sql执行过程
2021/06/20 MySQL
Python面向对象编程之类的概念
2021/11/01 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS