python实现的聊天室(一)

2024-06-18 05:08
文章标签 python 实现 聊天室

本文主要是介绍python实现的聊天室(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python实现的聊天室(一)

1、前言

我们学习了简单的Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型。本文再通过一个例子来加强一下对 Socket 编程的理解。
  首先要学习一下 Python 中实现异步 I/O 的一个函数 —— select。与前面文章使用多线程来并行处理多路 socket I/O相比,这里介绍的select 方法允许你响应不同 socket 的多个事件以及其它不同事件。例如你可以让 select 在某个 socket 有数据到达时,或者当某个 socket 可以写数据时,又或者是当某个 socket 发生错误时通知你,好处是你可以同时响应很多 socket 的多个事件。
  Python 中使用 list 来表示我们监控的文件描述符,当有事件到达时,返回的也是文件描述符的 list,表示这些文件有事件到达。select 方法的三个参数都是 list 类型,分别代表读事件、写事件、错误事件,同样方法返回值也是三个 list,包含的是哪些事件(读、写、异常)满足了。

2、需求分析

我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天。

我们要实现的分为两部分:

  • 服务器:负责与用户建立 Socket 连接,并将某个用户发送的消息广播到所有在线的用户。
  • 用户聊天客户端,可以输入聊天的内容并发送,同时可以显示其他用户的消息记录。

3、服务端实现

import socket,select,thread;  
host=socket.gethostname()  
port=5963  
addr=(host,port)      
inputs=[]  
fd_name={}  
def who_in_room(w):  name_list=[]  for k in w:  name_list.append(w[k])           return name_list  
def conn():  print 'runing'  ss=socket.socket()  ss.bind(addr)  ss.listen(5)  return ss  
def new_coming(ss):  client,add=ss.accept()  print 'welcome %s %s' % (client,add)  wel='''''welcome into the talking room . please decide your name.....'''  try:  client.send(wel)  name=client.recv(1024)  inputs.append(client)  fd_name[client]=name            nameList="Some people in talking room, these are %s" % (who_in_room(fd_name))  client.send(nameList)            except Exception,e:  print e        
def server_run():    ss=conn()  inputs.append(ss)        while True:  r,w,e=select.select(inputs,[],[])  for temp in r:  if temp is ss:  new_coming(ss)  else:  disconnect=False  try:  data= temp.recv(1024)  data=fd_name[temp]+' say : '+data  except socket.error:  data=fd_name[temp]+' leave the room'  disconnect=True                        if disconnect:  inputs.remove(temp)  print data  for other in inputs:  if other!=ss and other!=temp:  try:  other.send(data)  except Exception,e:  print e                      del fd_name[temp]                        else:  print data                        for other in inputs:  if other!=ss and other!=temp:  try:  other.send(data)  except Exception,e:  print e       
if __name__=='__main__':  server_run()  

4、客户端实现

import socket,select,threading,sys;    
host=socket.gethostname()    
addr=(host,5963)   
def conn():  s=socket.socket()  s.connect(addr)  return s  
def lis(s):  my=[s]  while True:  r,w,e=select.select(my,[],[])  if s in r:  try:  print s.recv(1024)  except socket.error:  print 'socket is error'  exit()             
def talk(s):  while True:  try:  info=raw_input()  except Exception,e:  print 'can\'t input'  exit()  try:  s.send(info)  except Exception,e:  print e  exit()          
def main():  ss=conn()  t=threading.Thread(target=lis,args=(ss,))  t.start()  t1=threading.Thread(target=talk,args=(ss,))  t1.start()  
if __name__=='__main__':  main()  

5、运行效果

运行时先启动服务端,再运行客户端。客户端运行后,命令行输入昵称,服务端会打印客户端IP及port信息,表明成功进入聊天室。当客户端关闭,表明该用户退出聊天室,服务器会转发该用户退出消息到各个客户端。 
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWeyAuRT-1593526706590)(http://odsh9s4s2.bkt.clouddn.com/mychatserver.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hlvbe3xq-1593526706593)(http://odsh9s4s2.bkt.clouddn.com/mychatclientA.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbQxcf64-1593526706595)(http://odsh9s4s2.bkt.clouddn.com/mychatclientB.png)]

6、参考链接

http://www.cnblogs.com/hazir/p/python_chat_room.html
链接

http://www.cnblogs.com/hazir/p/python_chat_room.html

这篇关于python实现的聊天室(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071381

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景