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中无限元素列表的实现方法
Aug 18 Python
Python 列表list使用介绍
Nov 30 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
python实现用户答题功能
Jan 17 Python
浅谈django orm 优化
Aug 18 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
python 的numpy库中的mean()函数用法介绍
Mar 03 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Python如何截图保存的三种方法(小结)
Sep 01 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
WordPress中"无法将上传的文件移动至"错误的解决方法
2015/07/01 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
利用python发送和接收邮件
2016/09/27 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python元组常见操作示例
2019/02/19 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python日志处理模块logging用法解析
2020/05/19 Python
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
村长贪污检举信
2014/04/04 职场文书
大型公益活动策划方案
2014/08/20 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
贷款担保书范本
2015/09/22 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫