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操作Elasticsearch数据索引的教程
Apr 08 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
用python编写第一个IDA插件的实例
May 29 Python
Django对models里的objects的使用详解
Aug 17 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
如何在python中判断变量的类型
Jul 29 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
如何使用scrapy中的ItemLoader提取数据
Sep 30 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php实现的递归提成方案实例
2015/11/14 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
Seajs的学习笔记
2014/03/04 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
javascript实现滚动条效果
2020/03/24 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python微信好友数据分析详解
2018/11/19 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
执行Python程序时模块报错问题
2020/03/26 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
周年庆典邀请函范文
2014/01/23 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书