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实现子类调用父类的方法
Nov 10 Python
Python生成随机数组的方法小结
Apr 15 Python
python实现k-means聚类算法
Feb 23 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
如何使用python进行pdf文件分割
Nov 11 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 Python
python画环形图的方法
Mar 25 Python
python suds访问webservice服务实现
Jun 26 Python
python 爬取京东指定商品评论并进行情感分析
May 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
php中的登陆login
2007/01/18 PHP
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
JS解析XML实例分析
2015/01/30 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python入门教程之运算符与控制流
2016/08/17 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
pandas 选择某几列的方法
2018/07/03 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
党校自我鉴定范文
2013/10/02 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
学前班语言教学计划
2015/01/20 职场文书
毕业生个人总结
2015/02/28 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
庆七一活动简报
2015/07/20 职场文书
初中班干部工作总结
2015/08/10 职场文书
yolov5返回坐标的方法实例
2022/03/17 Python