Python3 notes

简介: Python3 notes

用socket实现的一个简易聊天室功能,支持@用户私聊。

服务端代码:

import socket

import threading


# 客户端地址 名称

addr_name ={}


# 所有客户端

all_clients =[]


# 名称 客户端

name_client ={}


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


host = socket.gethostname()


port =9999


server.bind((host, port))


server.listen(5)


lock= threading.Lock()


print("开启聊天室")



def handle_sock(sock, addr):

   whileTrue:

       try:

           data = sock.recv(1024)

           msg = data.decode("utf-8")

           print("send msg")

           from_name = addr_name[str(addr)]

           if msg.startswith('@'):

               index = msg.index(' ')

               # 私聊人                

               to_name = msg[1:index]

               # 接收者客户端              

               to_sock = name_client[to_name]

               # 发送的消息                

               to_msg = msg[index:]

               send_one(to_sock, addr, from_name +":"+ to_msg)

           else:

               # 群发消息                

               send_all(all_clients, addr, from_name +":"+ msg)

       exceptConnectionResetError:

           exit_name = addr_name[str(addr)]

           exit_client = name_client[exit_name]

           all_clients.remove(exit_client)

           msg = exit_name +" 退出了群聊"          

           send_all(all_clients, addr, msg)

           break



def send_all(socks, addr, msg):

   for sock in socks:

       sock.send(msg.encode("utf-8"))



def send_one(sock, addr, msg):

   sock.send(msg.encode("utf-8"))



whileTrue:

   sock, addr = server.accept()

   name = sock.recv(1024).decode("utf-8")

   addr_name[str(addr)]= name

   name_client[name]= sock

   all_clients.append(sock)

   hello = name +"加入了聊天室"    

   send_all(all_clients, addr, hello)

   client_thread = threading.Thread(target=handle_sock, args=(sock, addr))

   client_thread.start()

客户端代码:

import socket

import threading


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


host = socket.gethostname()


port =9999s.connect((host, port))

name ="cc"

s.send(name.encode("utf-8"))



def receive_handle(sock, addr):

   whileTrue:

       data = sock.recv(1024)

       print(data.decode("utf-8"))


# 开启线程监听接收消息

receive_thread = threading.Thread(target=receive_handle, args=(s,'1'))

receive_thread.start()


whileTrue:

   re_data = input()

   s.send(re_data.encode("utf-8"))

相关文章
|
5月前
|
设计模式 存储 JavaScript
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
113 11
|
11月前
|
数据采集 数据可视化 数据处理
Python数据科学:Pandas库入门与实践
Python数据科学:Pandas库入门与实践
|
12月前
|
机器学习/深度学习 存储 监控
揭秘微调‘失忆’之谜:如何运用低秩适应与多任务学习等策略,快速破解灾难性遗忘难题?
【10月更文挑战第13天】本文介绍了几种有效解决微调灾难性遗忘问题的方法,包括低秩适应(LoRA)、持续学习和增量学习策略、记忆增强方法、多任务学习框架、正则化技术和适时停止训练。通过示例代码和具体策略,帮助读者优化微调过程,提高模型的稳定性和效能。
455 5
|
Ubuntu Linux Docker
docker swarm快速入门篇
关于Docker Swarm集群部署和验证高可用性的快速入门教程。
217 2
|
中间件 数据挖掘 API
ERP系统的系统集成与接口管理:实现高效协同
【7月更文挑战第29天】 ERP系统的系统集成与接口管理:实现高效协同
1069 0
|
存储 搜索推荐 索引
开发与运维数据问题之Retrievers在LangChain中扮演角色如何解决
开发与运维数据问题之Retrievers在LangChain中扮演角色如何解决
92 0
|
存储 安全 算法
如何保证区块链项目的安全性和稳定性?
**区块链安全与稳定性关键点:** - 密码学保护数据传输与存储,哈希确保不可篡改 - 安全共识算法(如PoW、PoS)保证节点共识 - 智能合约审计与应急响应机制提升安全性 - 加密、身份验证增强网络安全 - 持续技术改进,采用零知识证明、侧链 - 有效运营团队与社区参与,风险评估和维护 这些措施协同作用,确保区块链项目的稳健运行。
|
存储 小程序 API
报错-小程序:errMsg: “getUserProfile:fail privacy permission is not authorized“
报错-小程序:errMsg: “getUserProfile:fail privacy permission is not authorized“
533 0
|
SQL JSON 运维
如何使用下探分析定位多维指标异常根因
在系统运维过程中,关键指标的异常变化往往意味着服务异常、系统故障等等。因此我们往往会对一些关键指标进行自动巡检,例如异常检测和时序预测等等,及时感知指标的异常变化,了解系统的健康状况。对于复杂系统来说,感知到异常后直接在系统层面根因定位可能是十分困难的。因此我们需要一些手段缩小问题的排查范围或者直接定位问题,如使用 trace 根因分析等等。阿里云日志服务上线了下探分析功能,用于多维指标异常根因定位。我们将介绍该功能的使用场景和使用案例。
1124 0
如何使用下探分析定位多维指标异常根因
|
前端开发 Python
Python短信验证码
这篇文章主要为大家详细介绍了Python发送短信接入验证码的实现流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Python短信验证码