python cs socket通信

#server

import socket
import threading
import json
import select


def send_data(client,addr):
    while(1):
        ss=input(f"要发送给{addr}输入:")
        client.send(ss.encode("utf-8"))
        pass


def recv_data(client,addr,sockt_dict):
    threading.Thread(target=send_data,args=(client,addr,)).start()
    while(1):
        ###判断用户是否在线,如果recv抛出异常说明断线,那么给所有在线用户发送某某离线消息
        try:
            data=client.recv(1024)
        except Exception as e1:
            ss=json.loads(data.decode("utf-8"))
            cur_name=name
            for name in sockt_dict.keys():
                if sockt_dict[name]==client:
                    cur_name=name
            del sockt_dict[cur_name]
            ###发送离线消息
            for name in sockt_dict:
                msg={'type':'sysmessage','message':cur_name+'::已下线,当前用户列表如下\n'}
                sockt_dict[name].send(json.dumps(msg).encode("utf-8"))
                msg={'type':'sysmessage','message':str(list(sockt_dict.keys()))}
                sockt_dict[name].send(json.dumps(msg).encode("utf-8"))
            client.close()
            break

        if not data:
            continue
        try:
            ss=json.loads(data.decode("utf-8"))
            if ss['type']=='text':
                msg={'type':'text','message':ss['des_name']+"和你说::::》》"+ss['message']}
                sockt_dict[ss['name']].send(json.dumps(msg).encode("utf-8"))
            elif ss['type']=='username':
                sockt_dict[ss['name']]=client
                print(sockt_dict)
                for name in sockt_dict:
                    msg={'type':'sysmessage','message':str(list(sockt_dict.keys()))}
                    sockt_dict[name].send(json.dumps(msg).encode("utf-8"))
                continue
            elif ss['type']=='userlist':
                print("收到用户的消息")
                msg={'type':'userlist','message':list(sockt_dict.keys())}
                client.send(json.dumps(msg).encode("utf-8"))
                continue
        except Exception as e2:
            print(e2)
            if ss['type']=='text':
                try:
                    del sockt_dict[ss['name']]
                    msg={'type':'sysmessage','message':'发送消息失败,这个人已经下线!\n'}
                    sockt_dict[ss['des_name']].send(json.dumps(msg).encode("utf-8"))
                except Exception as e:
                    msg={'type':'sysmessage','message':'发送消息失败,没有这个人!\n'}
                    sockt_dict[ss['des_name']].send(json.dumps(msg).encode("utf-8"))
                    pass
            pass
    

if __name__=="__main__":
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(("0.0.0.0",2000))
    s.listen(10)
    sockt_dict=dict()
    while(1):
        client,addr=s.accept()
        print(addr)
        threading.Thread(target=recv_data,args=(client,addr,sockt_dict,)).start()
        
#client

import socket
import threading
import json


people_list=[]

def send_data(client):
    global people_list

    ###发送用户名
    while(1):
        my_name=''
        tmp=dict()
        my_name=input("请输入姓名:")
        if my_name in people_list:
            print("用户名已存在,请使用其他用户名")
            continue
        tmp['type']="username"
        tmp['name']=my_name
        client.send(json.dumps(tmp).encode("utf-8"))
        break

    #接收消息
    while(1):
        tmp=dict()
        tmp['type']="text"
        tmp['des_name']=my_name
        tmp['name']=input("你想把消息发送给谁:")
        tmp['message']=input("请输入消息:")
        ss=json.dumps(tmp)+"\n"
        client.send(ss.encode("utf-8"))

if __name__=="__main__":
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("127.0.0.1",2000))
    ###连接成功后发送获取所有用户列表消息,用于排除自己已存在的用户名
    tmp=dict()
    tmp['type']='userlist'
    s.send(json.dumps(tmp).encode("utf-8"))
    
    threading.Thread(target=send_data,args=(s,)).start()
    while(1):
        data=''
        try:
            data=s.recv(1024)
        except Exception as e:
            print("服务器断开")
            break
        if not data:
            continue
        ss=json.loads(data.decode("utf-8"))

        if ss['type']=='text':
            print("\n"+ss['message'])
        elif ss['type']=='userlist':
            people_list=ss['message']
            print("当前存在用户如下\n")
            print(people_list,"\n")
        elif ss['type']=='sysmessage':
            print("\n"+ss['message'])
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客热题:矩阵最长递增路径

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:矩阵最长递增路径题目链接方法一…

leetcode155 最小栈

题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…

关于LPC1768在线升级的实现的注意事项

开发环境:Keil 5 uVision V5.38.0.0 1、使用IAP的方式(应用程序在线编程) 2、在Flash中构建用于升级的不同区域 (1)引导区 (2)APP区 (3)升级代码存放区域 注意&…

阿里影业业绩大涨,除了沸腾的文娱市场还有什么原因?

影视文娱市场的火热仍在延续,新定档的电影和演出,不断引人关注这个行业的生机。而这个行业的支持者、受益者,就站在一线。 5月29日晚,阿里影业发布截至2024年3月31日的2024财年业绩公告。社会文娱消费的热情,对优质项…

深度学习笔记:2.Jupyter Notebook

Jupyter Notebook 常用操作快捷键魔法指令_jupyter notebook快捷键调用函数-CSDN博客https://blog.csdn.net/qq_26917905/article/details/137211336?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171748112816800182160793%2522%252C%2522scm%2522%253A%25222014…

Linux 下安装docker

Linux 下安装docker 本机是centos 7 非root 用户安装 如果是root用户安装则以下所有命令去掉 sudo 安装gcc 查看虚拟机是否安装 这是安装好了的 命令 gcc --version[nullDocker module]$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright ? 2015 Fr…

视频生成框架EasyAnimate正式开源!

近期,Sora模型的热度持续上涨,社区中涌现了一些类Sora的开源项目,这些项目均基于Diffusion Transformer结构,使用Transformer结构取代了UNet作为扩散模型的基线,旨在生成更长、更高分辨率、且效果更好的视频。EasyAnim…

罗德与施瓦茨RS SMA100A 9KHZ-3GHZ或6GHZ信号发生器

R&S SMA100A 提供信号质量、速度和灵活性。R&S SMA100A 是一款高级模拟发生器,因其出色的特性而树立了标准。 它结合了卓越的信号质量和极高的设置速度。无论是在开发、生产、服务还是维护方面,R&SSMA100A 都能出色地完成任务。 罗德与施瓦茨…

空调外机清洁机器人设计

现在的空调,有很多安装在高层,一旦安装使用后,外机几乎不可能再清洗。因为费用高,清洁工人的钱应该是好几百还不止;清洁风险高,空调师傅需要高空作业,如果发生意外业主难以承担。但空调运行几年…

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章,我们简单讲述了 WebContainer/api 、Terminal 的基本使用,离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor ,来实现初级代码编辑功能,讲述的是整个应用的搭建,并不单独针对monac…

LeetCode-43. 字符串相乘【数学 字符串 模拟】

LeetCode-43. 字符串相乘【数学 字符串 模拟】 题目描述:解题思路一:模拟乘法,两个数中每一位数相乘的时候乘上他们各自的进制数,之后求和。循环时,分别记录各自的进制数背诵版:解题思路三:0 题…

项目-双人五子棋对战:匹配模块的实现(3)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 模块详细讲解 功能需求 匹配就类似于大家平常玩的王者荣耀这样的匹配功能, 当玩家点击匹配之后, 就会进入到一个匹配队列, 当匹配到足够数量的玩家后, 就会进入确认页. 在这里, 我们主要实现的是1 - 1匹配功能, 首先先…

注册windows系统服务

目录 一、把任意exe程序注册成windows系统服务 二、将bat文件或exe程序注册成windows服务 三、设置window服务示例 1、redis 2、ActiveMQ 3、tomcat 4、nginx 一、把任意exe程序注册成windows系统服务 1、方法一:使用windows自带的命令InstallUtil.exe 步骤…

每日一练 - BGP协议报文发送机制

01 真题题目 BGP 协议的报文都是周期性发送. A.正确 B.错误 02 真题答案 B 03 答案解析 BGP(Border Gateway Protocol)边界网关协议并不定期或周期性发送其报文。与某些路由协议(如RIP)不同,BGP采用触发更新&#x…

pycharm链接auto al服务器

研0提前进组,最近阻力需求是把一个大模型复现,笔者电脑18年老机子,无法满足相应的需求。因此租用auto dl服务器。本文记录自己使用pycharm(专业版)链接auto dl期间踩过的坑。 1.下载pycharm专业版 这一步不解释了&am…

逐步掌握最佳Ai Agents框架-AutoGen 九 RAG应用

在最近的几篇文章里,我们使用AutoGen实现了一些Demo。这篇文章,我们将使用AutoGen来完成RAG应用开发。 RAG应用 RAG全称"Retrieval-Augmented Generation",即检索增强生成,它是自然语言处理中的一项技术。这种模型结合了检索式&a…

Latex之图片排列的简单使用(以MiKTeX工具为例)

一、参考资料 Latex如何插入图片 Latex 学术撰写工具推荐(在线、Windows、Mac、Linux) 关于Latex并排多张图片及加入图片说明的方法 二、准备工作 1. 在线LaTex工具 Overleaf 2. 本地LaTex工具 MiKTeX 3. 测试用例 \documentclass{article} \ti…

【Vue】computed 计算属性 VS methods 方法

文章目录 一、computed 计算属性二、methods 方法 一、computed 计算属性 作用:封装了一段对于数据的处理,求得一个结果,而且还可以拿这个结果去缓存。 语法: ① 写在 computed 配置项中 ② 作为属性,直接使用 → …

拓展商机的金钥匙:成为SSL证书合作商的长期回报

在当今数字化浪潮中,网络安全已经成为企业生存和发展不可或缺的一部分。随着在线交易和数据交换的增多,SSL证书作为保障网站安全和增强用户信任的关键工具,其重要性日益凸显。成为SSL证书的合作商后,不仅能够立即开启新的收入来源…

解决微信小程序分享按钮不可用

问题描述 在微信小程序中点击胶囊按钮上的三个点,在弹出的对话框中的【分享给好友】【分享到朋友圈】按钮都属于不可用的状态,显示未设置。 问题截图 解决方案 在每个需要此功能的页面都需要添加此代码,否则就不能进行使用。 // vue3时&l…