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 调用VC++的动态链接库(DLL)
Sep 06 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
python Shapely使用指南详解
Feb 18 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
pandas取dataframe特定行列的实现方法
May 24 Python
python游戏开发Pygame框架
Apr 22 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
做个自己站内搜索引擎
2006/10/09 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
JavaScript闭包详解
2015/02/02 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
python处理html转义字符的方法详解
2016/07/01 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python解释器安装教程的方法步骤
2020/07/02 Python
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
某公司部分笔试题
2013/11/05 面试题
护士实习自我鉴定
2013/10/22 职场文书
房地产员工找工作的自我评价
2013/11/15 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书