python基于C/S模式实现聊天室功能


Posted in Python onJanuary 09, 2019

最简单的模式,C/S模式实现聊天室

从半双工开始,何谓半双工?半双工即是说双方可以互发消息,但一次只能一个用户发送。

 只要稍微会点socket编程的人都会觉得很简单,所以过过场,直接上代码。

服务器端代码:

from socket import *
from time import ctime
 
HOST = ''
PORT = 4568
BUFSIZE = 1024
ADDR = (HOST,PORT)
 
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
tcpSerSocket.bind(ADDR)
tcpSerSocket.listen(5)
 
while True:
 print('waitint for connection...')
 tcpCliSocket, addr = tcpSerSocket.accept()
 print('connecting from: ', addr)
 
 while True:
 data = tcpCliSocket.recv(BUFSIZE)
 if not data:
  break
 print data
 msg = raw_input('>')
 tcpCliSocket.send('[%s] %s' % (ctime(), msg))
 
tcpCliSocket.close()
tcpSerSocket.close()

客户端代码:

from socket import *
 
HOST = 'localhost'
PORT = 4568
BUFSIZE = 1024
ADDR = (HOST, PORT)
 
tcpCliSocket = socket(AF_INET, SOCK_STREAM)
tcpCliSocket.connect(ADDR)
 
while True:
 data = raw_input('>>')
 if not data:
 break
 tcpCliSocket.send(data)
 data = tcpCliSocket.recv(BUFSIZE)
 if not data:
 break
 print data
 
tcpCliSocket.close()

运行结果我就不截图了,如果还不会的就复制下来运行一遍。

上面只是最简单的入门,一点都不好使,问题多着。

下面看怎么实现全双工。全双工就是双方可任意给对方发送消息。

全双工明显要用到多线程。我们在主线程之外创建两个子线程,一个负责接收消息,另一个负责接受用户输入并发送消息。

服务器端代码:

#coding: utf-8
from socket import *
from time import ctime
import threading
from sys import stdout
 
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
 
def Send(sck):
 while True:
 data = raw_input('>')
 sck.send(data)
 
def Deal(sck, addr):
 while True:
 data = sck.recv(BUFSIZE)
 if data == "quit":
  sck.close()
  break
 str = '\nfrom' + addr[0] + ':' + data + '\n>'
 stdout.write(str)
 
chatSerSock = socket(AF_INET, SOCK_STREAM)
chatSerSock.bind(ADDR)
chatSerSock.listen(5)
 
threads = []
 
while True:
 print 'waiting for connection...'
 chatCliSock, addr = chatSerSock.accept()
 print "...connected from: ", addr
 t = threading.Thread(target=Deal, args=(chatCliSock, addr))
 threads.append(t)
 t = threading.Thread(target=Send, args=(chatCliSock,))
 threads.append(t)
 for i in range(len(threads)):
 threads[i].start()
 threads[0].join()
 
chatCliSock.close()
chatSerSock.close()

客户端代码:

#coding: utf8
from socket import *
from time import ctime
import threading
from sys import stdout
 
def Send(sck, test):
 while True:
 data = raw_input('>')
 sck.send(data)
 if data == "quit":
  break
def Recieve(sck, test):
 while True:
 data = sck.recv(BUFSIZ)
 if data == "quit":
  sck.close()
  break
 str = "\nfrom server:" + data + "\n>"
 stdout.write(str)
 
HOST = 'localhost'
PORT= 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
threads = []
 
if __name__ == "__main__":
 chatCliSock = socket(AF_INET, SOCK_STREAM)
 chatCliSock.connect(ADDR)
 t = threading.Thread(target=Send, args = (chatCliSock, None))
 threads.append(t)
 t = threading.Thread(target=Recieve, args = (chatCliSock, None))
 threads.append(t)
 for i in range(len(threads)):
 threads[i].start()
 threads[0].join()
 
chatCliSock.close()

运行结果:

python基于C/S模式实现聊天室功能

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

Python 相关文章推荐
python通过加号运算符操作列表的方法
Jul 28 Python
MySQL适配器PyMySQL详解
Sep 20 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
python 两种方法删除空文件夹
Sep 29 Python
用python实现一个简单的验证码
Dec 09 Python
golang中的空接口使用详解
Mar 30 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 #Python
Python 利用pydub库操作音频文件的方法
Jan 09 #Python
Python简单过滤字母和数字的方法小结
Jan 09 #Python
使用python批量化音乐文件格式转换的实例
Jan 09 #Python
python+ffmpeg批量去视频开头的方法
Jan 09 #Python
Python实现简易过滤删除数字的方法小结
Jan 09 #Python
python 实现视频流下载保存MP4的方法
Jan 09 #Python
You might like
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
如何对PHP程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
搭建vue开发环境
2018/07/19 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
Python实现partial改变方法默认参数
2014/08/18 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Python函数装饰器实现方法详解
2018/12/22 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
高中升旗仪式演讲稿
2014/09/09 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
Python图片检索之以图搜图
2021/05/31 Python