python制作远程聊天工具

本文介绍了如何使用Python创建一个简单的远程聊天工具。通过设置客户端和服务端的IP地址,利用socket库进行网络通信,实现信息的发送和接收。客户端程序不断读取用户输入并发送至服务端,同时接收并显示服务端的消息。服务端则负责接收客户端连接,处理昵称设置,并广播消息到所有已连接的客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们就制作一个python远程聊天工具。

我们要聊天要用软件,下载的聊天软件其实就是客户端。

如果要能聊天,还要有服务端才行。

服务端其实就是处理信息数据的中转站,客户端就是收发信息的那一端。

今天我们制作的python远程聊天工具也是这样,

只是运行前要保证客户端程序中的一个IP地址设为服务端的真实IP地址,

服务端程序中的IP地址也是要设成服务端那边的真实IP地址。

客户端代码:

import socket
import threading

HOST = '192.168.2.26'  # 主机名,可以是IP地址
PORT = 65432        # 端口号,需与服务端相同

# 定义函数,用于接收并处理服务端发送的消息
def receive_msg(sock):
    while True:
        data = sock.recv(1024)      # 一次最多读取1024字节数据
        if not data:
            break
        msg = data.decode()         # 将二进制数据转换为字符串
        print(msg)

# 创建socket对象
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 建立连接
    s.connect((HOST, PORT))
    # 在主线程中循环读取控制台输入,并发送消息给服务端
    while True:
        msg = input()               # 在控制台输入要发送的消息
        s.sendall(msg.encode())     # 将消息转换为二进制数据,并发送给服务端
        # 新建一个线程用于接收并处理服务端发送的消息
        threading.Thread(target=receive_msg, args=(s,)).start()

服务端代码:

import socket
import threading

# 定义全局变量,用于保存客户端连接和昵称信息
connections = []
nicks = []

# 定义函数,用于接收并处理客户端消息
def handle_client(conn, addr):
    with conn:
        # 当有新连接加入时,提示其输入昵称
        conn.sendall('请输入你的昵称:'.encode())
        nickname = conn.recv(1024).decode()
        print('客户端', addr, '设置昵称为', nickname)
        # 将新昵称添加到全局列表中
        nicks.append(nickname)
        # 将新连接加入全局列表中
        connections.append(conn)
        # 循环监听客户端消息
        while True:
            try:
                data = conn.recv(1024)   # 一次最多读取1024字节数据
                if not data:
                    break
                msg = data.decode()      # 将二进制数据转换为字符串
                print(nickname, ':', msg)
                # 循环向所有已连接的客户端发送消息
                for c in connections:
                    if c != conn:       # 不向消息来源客户端发送消息
                        c.sendall(('[' + nickname + ']: ' + msg).encode())
            except Exception as e:
                print('error:', e)
                break
        # 移除断开连接的昵称和套接字
        connections.remove(conn)
        nicks.remove(nickname)
        print('客户端', addr, '已断开连接')
        # 如果所有客户端都断开连接,就不再处理此线程,继续等待新的连接
        if not connections:
            print('等待新的连接...')
            return

HOST = '192.168.2.26'  # 主机名,可以是IP地址
PORT = 65432        # 端口号,建议使用1024以上的端口号

# 创建socket对象
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 绑定主机名和端口号
    s.bind((HOST, PORT))
    # 开始监听连接请求,一直循环下去
    s.listen()
    print('服务器已启动,等待客户端连接...')
    # 接收连接请求,并创建新线程处理连接
    while True:
        try:
            conn, addr = s.accept()
            # 打印连接信息
            print('客户端', addr, '已连接')
            # 在新线程中处理客户端连接
            threading.Thread(target=handle_client, args=(conn, addr)).start()
        except Exception as e:
            print('error:', e)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值