python聊天室

python聊天室

下面是一个简单的示例,包含了chat_client.py和chat_server.py的代码。

chat_server

chat_server.py监听指定的端口,并接收来自客户端的消息,并将消息广播给所有连接到服务器的客户端

import socket
import threading

def handle_client(client_socket, client_address):
    # 处理每个客户端的函数
    while True:
        try:
            data = client_socket.recv(1024).decode('utf-8')  # 接收客户端发送的消息
            if not data:
                break
            print(f'{client_address[0]}:{client_address[1]} - {data}')  # 打印客户端的消息和地址
            broadcast_data = f'{client_address[0]}:{client_address[1]} - {data}'.encode('utf-8')  # 准备广播消息
            broadcast(broadcast_data, client_socket)  # 广播消息给所有连接到服务器的客户端
        except:
            break

    client_socket.close()

def broadcast(message, sender_socket):
    # 广播消息给所有连接到服务器的客户端
    for client in clients:
        if client != sender_socket:
            client.send(message)

def start_server(port):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', port))  # 绑定服务器的 IP 地址和端口号
    server_socket.listen(10)  # 监听客户端连接,允许最多 5 个同时连接
    print(f'服务器已启动,监听端口 {port}')

    while True:
        client_socket, client_address = server_socket.accept()  # 接受客户端的连接请求
        clients.append(client_socket)  # 将客户端添加到客户端列表
        print(f'客户端已连接:{client_address[0]}:{client_address[1]}')
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_thread.start()  # 启动一个线程处理客户端

clients = []

if __name__ == '__main__':
    port = int(input('请输入端口号:'))
    start_server(port)

chat_client

chat_client.py连接到服务器,并允许用户发送消息

import socket
import threading

def receive_messages(client_socket):
    # 接收服务器发送的消息
    while True:
        try:
            data = client_socket.recv(1024).decode('utf-8')  # 接收消息
            print(data)  # 打印消息
        except:
            break

    client_socket.close()

def send_message(client_socket):
    # 发送消息给服务器
    while True:
        message = input()  # 输入消息
        client_socket.send(message.encode('utf-8'))  # 发送消息到服务器

    client_socket.close()

def start_client(server_ip, server_port):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        client_socket.connect((server_ip, server_port))  # 连接到服务器
        print(f'已连接到 {server_ip}:{server_port}')
        receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))
        receive_thread.start()  # 启动一个线程接收服务器的消息
        send_thread = threading.Thread(target=send_message, args=(client_socket,))
        send_thread.start()  # 启动一个线程发送消息
    except:
        print('连接失败。')

if __name__ == '__main__':
    server_ip = input('请输入服务器 IP 地址:')
    server_port = int(input('请输入服务器端口号:'))
    start_client(server_ip, server_port)

使用方式

1.局域网聊天

在本地使用cmd运行server,client可以起任意数量(不超过10个,在server里设置最大数量),client的IP地址填写自己本地ip即可,本地ip可以用ipconfig指令获取。

在这里插入图片描述

2.公网聊天

需要你有一个公网服务器,启动server即可,然后在任何电脑上启动client参与群聊。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PerCheung

觉得有帮助的话就打赏支持一下吧

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

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

打赏作者

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

抵扣说明:

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

余额充值