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中元类用法实例
Oct 10 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
Django自定义用户认证示例详解
Mar 14 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
python覆盖写入,追加写入的实例
Jun 26 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Python实现钉钉订阅消息功能
Jan 14 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
Yii快速入门经典教程
2015/12/28 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
详解Django通用视图中的函数包装
2015/07/21 Python
python之Character string(实例讲解)
2017/09/25 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
体育老师的教学自我评价分享
2013/11/19 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
八项规定整改措施
2014/02/12 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
教师节倡议书
2014/08/30 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书