基于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的Tkinter实现一个简易计算器
Dec 31 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
Python随机函数库random的使用方法详解
Aug 21 Python
详解python中的模块及包导入
Aug 30 Python
Python collections模块的使用方法
Oct 09 Python
Python通过format函数格式化显示值
Oct 17 Python
python基础之while循环语句的使用
Apr 20 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
模拟flock实现文件锁定
2007/02/14 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
PHP6新特性分析
2016/03/03 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python中断多重循环的思路总结
2019/10/04 Python
QML用PathView实现轮播图
2020/06/03 Python
Python如何给你的程序做性能测试
2020/07/29 Python
python3让print输出不换行的方法
2020/08/24 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
敬老月活动总结
2014/08/28 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
运动会开幕式主持词
2015/07/01 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
七年级话题作文之执着
2019/11/19 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
德生2P3收音机开箱评测
2022/04/30 无线电