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 07 Python
python3 爬取图片的实例代码
Nov 06 Python
Python常用模块之requests模块用法分析
May 15 Python
Python动态语言与鸭子类型详解
Jul 01 Python
pywinauto自动化操作记事本
Aug 26 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python求最大连续子数组的和
2018/07/07 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
用python生成1000个txt文件的方法
2018/10/25 Python
python创建子类的方法分析
2019/11/28 Python
XML文档面试题
2015/08/05 面试题
测绘工程个人的自我评价
2013/11/23 职场文书
电脑教师的自我评价
2013/12/18 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
爱情保证书
2015/01/17 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
《山中访友》教学反思
2016/02/24 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
Python中的程序流程控制语句
2022/02/24 Python
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android