socket编程实现多人聊天室

 说明:需先运行服务端,再运行客户端

要实现多个客户端同时进行可在控制台中运行多个客户端程序

代码分享 

socket服务端

import socket
import threading
#存入用户和连接名的字典
mydict=dict()
#创建列表存入连接值
mylist=list()
#把聊天信息发送给除自己之外的所有人
def sendsum(fileno,message):
    for conn in mylist:
            try:
                if conn.fileno()!=fileno:
                    conn.send(message.encode())
            except:
                pass
#保持客户端与服务器端的持续连接
def run(conn_server,fileno):
    username=conn_server.recv(1024).decode()
    print(username)
    mydict[fileno]=username
    #存入连接套接字
    mylist.append(conn_server)
    #向除自己之外的其他人发送信息
    sendsum(conn_server.fileno(),'系统提示* '+username+'已经进入系统,快和他聊天吧!')
    while True:
        try:
            client_message=conn_server.recv(1024).decode()
            print(username+':'+client_message)
            if client_message:
                sendsum(conn_server.fileno(), username + ' say:' + client_message)
        except:
            #一旦其中的一个客户端关闭就关闭通信套接字,并向其他用户发送提示信息
            sendsum(conn_server.fileno,'*'+username+'已经离开聊天室'+'*')
            conn_server.close()
            return
socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_server.bind(('localhost',4002))
socket_server.listen(128)
print('监听开始了!')
while True:
    conn_server,ip_address=socket_server.accept()
    print(conn_server)
    if conn_server.recv(1024).decode()=='1':
        conn_server.send('*connection is successsful!!!*\n * welcome to chat *'.encode())
        threadsum=threading.Thread(target=run,args=(conn_server,conn_server.fileno()))
        threadsum.setDaemon(True)
        threadsum.start()
    else:
        print("*连接失败!退出程序*")
        conn_server.close()
        socket_server.close()

socket客户端


import socket
#创建套接字
import threading
def sendProcess(socket_client):
    while True:
        try:
            myMassage=input('me:')
            socket_client.send(myMassage.encode())
            print('发送成功!!')
        except:
            pass
def acceptProcess(socket_client):
    while True:
        try:
            print(socket_client.recv(1024).decode())
        except:
            pass
socket_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务器socket
socket_client.connect(('localhost',4002))
socket_client.send(b'1')
#接受服务器的连接状态
data=socket_client.recv(1024).decode()
print(data)
#用户登录
username=input('请输入用户名:')
socket_client.send(username.encode())

#创建子线程,用来收发信息
sendThread=threading.Thread(target=sendProcess,args=(socket_client,))
acceptThread=threading.Thread(target=acceptProcess,args=(socket_client,))
threads=[sendThread,acceptThread]
for i in threads:
    i.setDaemon(True)
    i.start()
i.join()

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜小白也想的美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值