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中利用sqrt()方法进行平方根计算的教程
May 15 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python实现一组典型数据格式转换
Dec 15 Python
python队列原理及实现方法示例
Nov 27 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
pytorch 求网络模型参数实例
Dec 30 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
python中取绝对值简单方法总结
Jul 24 Python
Python datetime 如何处理时区信息
Sep 02 Python
python从Oracle读取数据生成图表
Oct 14 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中常用的转义函数
2014/02/28 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
javascript 原型链维护和继承详解
2014/11/26 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
基于javascript实现随机颜色变化效果
2016/01/14 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
Python字符串详细介绍
2015/05/09 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
python集合常见运算案例解析
2019/10/17 Python
Python是什么 Python的用处
2020/05/26 Python
python小白学习包管理器pip安装
2020/06/09 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
Servlet方面面试题
2016/09/28 面试题
幼儿园消防演练方案
2014/02/13 职场文书
派出所所长先进事迹
2014/05/19 职场文书
国际贸易求职信
2014/07/05 职场文书
代理人委托书
2014/08/01 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
cf战队宣传语
2015/07/13 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS