基于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 相关文章推荐
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
Python中装饰器学习总结
Feb 10 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
Python求解正态分布置信区间教程
Nov 20 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 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初学者(入门学习经验谈)
2010/10/12 PHP
php explode函数实例代码
2012/02/27 PHP
php英文单词统计器
2016/06/23 PHP
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
BootStrap selectpicker
2016/06/20 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
python处理cookie详解
2014/02/07 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
python 魔法函数实例及解析
2019/09/25 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
妇产科护士自我鉴定
2013/10/15 职场文书
高中自我评价分享
2013/12/05 职场文书
普通员工辞职信
2014/01/17 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
2014年党委工作总结
2014/11/22 职场文书
爱心捐助活动总结
2015/05/09 职场文书
埃及王子观后感
2015/06/16 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android