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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonsocket通信是一种在网络中传输数据的方式,通过套接字(socket)来实现。它可以用于实现不同计算机之间的数据传输和通信。 要使用Python进行socket通信,首先需要导入socket模块。然后,可以创建一个socket对象,并指定通信协议(如TCP或UDP),以及IP地址和端口号。接着,可以使用socket对象的一些方法来发送和接收数据。 下面是一个简单的例子,演示了如何使用Pythonsocket模块进行客户端和服务器端的通信服务器端代码: ```python import socket # 创建一个socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind(('localhost', 8888)) # 监听客户端连接 server_socket.listen(5) print('服务器启动成功,等待客户端连接...') # 接受客户端连接 client_socket, addr = server_socket.accept() print('客户端已连接:', addr) # 接收客户端发送的数据 data = client_socket.recv(1024) print('接收到的数据:', data.decode()) # 发送响应给客户端 client_socket.send('Hello, Client!'.encode()) # 关闭socket连接 client_socket.close() server_socket.close() ``` 客户端代码: ```python import socket # 创建一个socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect(('localhost', 8888)) # 发送数据给服务器 client_socket.send('Hello, Server!'.encode()) # 接收服务器的响应 data = client_socket.recv(1024) print('接收到的数据:', data.decode()) # 关闭socket连接 client_socket.close() ``` 在这个例子中,服务器端首先创建一个socket对象,并绑定IP地址和端口号。然后通过调用`listen()`方法开始监听客户端连接。当有客户端连接请求时,使用`accept()`方法接受连接,并返回一个新的socket对象和客户端地址。接着,服务器端可以通过新的socket对象与客户端进行通信。 客户端先创建一个socket对象,并调用`connect()`方法连接到服务器。然后,可以使用`send()`方法发送数据给服务器,并使用`recv()`方法接收服务器的响应。 相应问题: 1. 如何指定TCP或UDP协议? 2. 还有其他的socket创建方式吗? 3. 如何处理多个客户端同时连接的情况? 4. 如何实现长连接?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值