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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
Python中安装easy_install的方法
Nov 18 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
tensorflow的计算图总结
Jan 12 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python操作链表的示例代码
Sep 27 Python
pandas抽取行列数据的几种方法
Dec 13 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 array_walk() 数组函数
2011/07/12 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
Python第三方库的安装方法总结
2016/06/06 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
高山背包:High Sierra
2017/11/23 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
2014年小学班主任工作总结
2014/11/08 职场文书
皇城相府导游词
2015/02/06 职场文书
保险内勤岗位职责
2015/04/13 职场文书
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
Python实现简单得递归下降Parser
2022/05/02 Python