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 25 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
python运行时间的几种方法
Jun 17 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
Python绘制热力图示例
Sep 27 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
python 函数中的参数类型
Feb 11 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python类型转换的魔术方法详解
Dec 23 Python
python中altair可视化库实例用法
Jan 26 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
PHP 学习路线与时间表
2010/02/21 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
实现PHP搜索加分页
2016/10/12 PHP
php生出随机字符串
2017/07/06 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
javascript history对象详解
2017/02/09 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python多进程编程技术实例分析
2014/09/16 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
详解python eval函数的妙用
2017/11/16 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python如何获取文件指定行的内容
2020/05/27 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
高中生毕业学习总结的自我评价
2013/11/14 职场文书
教师远程培训感言
2014/03/06 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
JavaScript中reduce()的用法
2022/05/11 Javascript