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处理json数据中的中文
Mar 06 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
django 解决manage.py migrate无效的问题
May 27 Python
python使用turtle库绘制树
Jun 25 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
Python中垃圾回收和del语句详解
Nov 15 Python
用Python绘制漫步图实例讲解
Feb 26 Python
python实现图像全景拼接
Mar 27 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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 中的类
2006/10/09 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
JavaScript 学习历程和心得分享
2010/12/12 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
Vue实现日历小插件
2019/06/26 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
深入理解Python 代码优化详解
2014/10/27 Python
Python selenium 三种等待方式解读
2016/09/15 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Python中内建模块collections如何使用
2020/05/27 Python
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
TCP/IP模型的分界线
2012/12/01 面试题
一些关于MySql加速和优化的面试题
2014/01/30 面试题
高中自我鉴定
2013/12/20 职场文书
酒店端午节促销方案
2014/02/18 职场文书
推荐信怎么写
2014/05/09 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
青年联谊会致辞
2015/07/31 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫