• 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'])
     

  • 相关阅读:
    【推荐系统】多任务学习之ESMM模型(更新ing)
    亚马逊日本站养号测评需要哪些资源和注意点,如何确保账号的稳定性和纯净环境?
    《HelloGitHub》第 80 期
    评估指标Pre\Rec\F1\AUC
    JavaWeb学习——IDEA通过MyBatis搭建,Vue编写,axios交互的增删查改项目
    TCP的保活机制
    Vue+Swiper实现轮播图效果
    面试题 01.01. 判定字符是否唯一
    element-ui 表格 点击选中
    java毕业设计超市网站mybatis+源码+调试部署+系统+数据库+lw
  • 原文地址:https://blog.csdn.net/weixin_39689854/article/details/139432846