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代理抓取并验证使用多线程实现
May 03 Python
python正则表达式抓取成语网站
Nov 20 Python
python flask实现分页效果
Jun 27 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
如何学习Python time模块
Jun 03 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
Python 统计序列中元素的出现频度
Apr 26 Python
python计算列表元素与乘积详情
Aug 05 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
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
使用angular写一个hello world
2015/01/23 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
js实现每日签到功能
2018/11/29 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python中用于返回绝对值的abs()方法
2015/05/14 Python
python实现井字棋游戏
2020/03/30 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
python中的for循环
2018/09/28 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python如何实现线程间通信
2020/07/30 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
全球工业:Global Industrial
2020/02/01 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
横店影视城导游词
2015/02/06 职场文书
教师病假条范文
2015/08/17 职场文书