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删除windows垃圾文件的方法
Jul 14 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
numpy中的高维数组转置实例
Apr 17 Python
替换python字典中的key值方法
Jul 06 Python
Python列表切片操作实例总结
Feb 19 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Python根据服务获取端口号的方法
Sep 25 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
python 爬取豆瓣网页的示例
Apr 13 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 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下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
jquery获取radio值实例
2014/10/16 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
JSON Web Tokens的实现原理
2017/04/02 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
python简单贪吃蛇开发
2019/01/28 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
秋季运动会稿件
2014/01/30 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
教师节寄语2015
2015/03/23 职场文书
项目战略合作意向书
2015/05/08 职场文书
班主任培训研修日志
2015/11/13 职场文书