基于Python socket实现简易网络聊天室

下面是基于Python socket实现简易网络聊天室的完整攻略。

步骤一:实现基本的客户端和服务端

首先我们需要实现简单的客户端和服务端,可以让客户端发送消息给服务端,并让服务端把消息广播给所有的客户端。

客户端

import socket
import threading

IP = '127.0.0.1'
PORT = 1234

def send_message():
    while True:
        message = input('')
        client_socket.sendall(message.encode('utf-8'))

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))

threading.Thread(target=send_message).start()

while True:
    data = client_socket.recv(1024)
    print(data.decode('utf-8'))

服务端

import socket
import threading

IP = '127.0.0.1'
PORT = 1234

clients = []

def send_all(message, sender):
    for client in clients:
        if client != sender:
            client.sendall(message)

def handle_client(client, address):
    clients.append(client)
    while True:
        data = client.recv(1024)
        send_all(data, client)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP, PORT))
server_socket.listen()

while True:
    client, address = server_socket.accept()
    threading.Thread(target=handle_client, args=(client, address)).start()

步骤二:添加用户名

接下来我们要让客户端能够设置一个用户名,显示在发送消息的前面。

我们可以在客户端和服务端加上一个username字段,这里我们用JSON格式来传递客户端和服务端之间的消息。

修改后的代码如下:

客户端

import socket
import threading
import json

IP = '127.0.0.1'
PORT = 1234

def send_message():
    while True:
        message = input('')
        data = {'username': username, 'message': message}
        client_socket.sendall(json.dumps(data).encode('utf-8'))

username = input('Enter your username: ')

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))

threading.Thread(target=send_message).start()

while True:
    data = client_socket.recv(1024)
    data = json.loads(data.decode('utf-8'))
    print(f'{data["username"]}: {data["message"]}')

服务端

import socket
import threading
import json

IP = '127.0.0.1'
PORT = 1234

clients = []

def send_all(data, sender):
    for client in clients:
        if client != sender:
            client.sendall(json.dumps(data).encode('utf-8'))

def handle_client(client, address):
    username = None
    while True:
        data = client.recv(1024)
        data = json.loads(data.decode('utf-8'))
        if username is None:
            username = data['username']
            clients.append(client)
        send_all(data, client)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP, PORT))
server_socket.listen()

while True:
    client, address = server_socket.accept()
    threading.Thread(target=handle_client, args=(client, address)).start()

现在客户端在发送消息的时候会自动带上当前的用户名。

示例一:Ethan向聊天室中发送一条消息

Ethan 的客户端:

Enter your username: Ethan
Hello this is Ethan.

聊天室中其他客户端:

Ethan: Hello this is Ethan.

示例二:Mike向聊天室中发送一条消息

Mike 的客户端:

Enter your username: Mike
Hi, everyone!

聊天室中其他客户端:

Ethan: Hello this is Ethan.
Mike: Hi, everyone!

步骤三:支持私聊

最后我们再让聊天室支持私聊功能。

我们可以在客户端发送消息时,添加一个to字段,表示发给谁;在服务端收到消息时,判断一下是广播还是私聊,然后分别进行处理。

具体实现如下:

客户端

import socket
import threading
import json

IP = '127.0.0.1'
PORT = 1234

def send_message():
    while True:
        message = input('')
        data = {'username': username, 'message': message, 'to': to}
        client_socket.sendall(json.dumps(data).encode('utf-8'))

username = input('Enter your username: ')

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))

threading.Thread(target=send_message).start()

while True:
    data = client_socket.recv(1024)
    data = json.loads(data.decode('utf-8'))
    if data['to'] == username or data['to'] == 'all':
        print(f'{data["username"]}: {data["message"]}')

服务端

import socket
import threading
import json

IP = '127.0.0.1'
PORT = 1234

clients = []

def send_all(data, sender):
    for client in clients:
        if client != sender:
            client.sendall(json.dumps(data).encode('utf-8'))

def handle_client(client, address):
    username = None
    while True:
        data = client.recv(1024)
        data = json.loads(data.decode('utf-8'))
        if username is None:
            username = data['username']
            clients.append(client)
        if data['to'] == 'all':
            send_all(data, client)
        else:
            for c in clients:
                if c != client and c.getpeername() == data['to']:
                    c.sendall(json.dumps(data).encode('utf-8'))
                    break

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP, PORT))
server_socket.listen()

while True:
    client, address = server_socket.accept()
    threading.Thread(target=handle_client, args=(client, address)).start()

现在客户端发送私聊消息时,需要在消息前加上@和用户名,例如@Ethan Hi,表示把消息发给 Ethan。

示例三:Ethan向聊天室中发送一条私聊消息

Ethan 的客户端:

Enter your username: Ethan
@Mike Hi Mike, how are you doing?

聊天室中其他客户端:

Ethan: @Mike Hi Mike, how are you doing?

Mike 的客户端上不会出现这条消息,因为这是一条私聊消息,只有 Mike 和 Ethan 能看到。

示例四:Mike向聊天室中发送一条私聊消息

Mike 的客户端:

Enter your username: Mike
@Ethan Hi Ethan, are you busy now?

聊天室中其他客户端:

Ethan: @Mike Hi Ethan, are you busy now?

以上就是基于Python socket实现简易网络聊天室的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Python socket实现简易网络聊天室 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 浅析python继承与多重继承

    浅析Python继承与多重继承 1. 什么是继承 继承是一种面向对象编程的机制,它允许从一个类来创建新的类(子类),新的类继承了原有类(父类)的所有属性和方法。继承的核心概念是:子类拥有父类的所有方法和属性。子类可以添加自己的方法和属性,也可以覆盖(重写)父类的方法。 2. 继承的语法 Python继承的语法非常简单,只需要在子类的声明中指定父类的名称即可,…

    python 2023年6月3日
    00
  • Python语言描述KNN算法与Kd树

    下面是关于Python语言描述KNN算法与Kd树的攻略。 KNN算法是什么? KNN算法全称为K-近邻算法,基于特征之间的相似度计算样本之间的距离,进而来进行分类或回归。KNN是一个简单但十分有效的算法,它的主要思想是:新样本到训练样本中距离最近的K个样本的类别来决定它的类别。 KNN算法的应用场景 KNN算法适用于数据比较大、准确度要求不是那么高的场景,比…

    python 2023年6月3日
    00
  • Python中asyncore的用法实例

    下面是关于“Python中asyncore的用法实例”的完整攻略: 一、asyncore库的介绍 在介绍asyncore的用法之前,先来了解一下asyncore库的概念。asyncore是Python的一个标准库,其目的是为了方便的实现基于事件驱动的网络编程。asyncore是基于SocketServer.py、呈现异步方式的socket支持并发操作。 二、…

    python 2023年5月19日
    00
  • 详解Python3的TFTP文件传输

    下面是详解Python3的TFTP文件传输的完整攻略。 什么是TFTP文件传输 TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,它广泛用于网络中,特别是在无盘设备(例如路由器、交换机等)和网络启动环境中。TFTP数据传输使用UDP协议来建立数据报文和传递数据包,而不是TCP协议,因此传输速度相对更慢,但更简单…

    python 2023年6月3日
    00
  • Python网络爬虫实例讲解

    Python网络爬虫实例讲解 目录 简介 环境搭建 常用Python爬虫库的介绍 爬虫实例1:爬取网易云音乐评论 爬虫实例2:爬取豆瓣电影TOP250 1. 简介 Python是一门易学易用的编程语言,也是一门广泛应用于数据科学、人工智能等领域的语言。由于其开源、强大的库支持以及优秀的数据处理能力,Python在大数据分析、机器学习、自然语言处理等领域得到了…

    python 2023年5月14日
    00
  • python实现模拟器爬取抖音评论数据的示例代码

    下面是Python实现模拟器爬取抖音评论数据的完整攻略。 1. 环境准备 1.1 安装Python 首先需要在本地电脑上安装Python,并配置好环境变量。可以到Python 官网下载最新的稳定版本,并按照向导进行安装。 1.2 安装浏览器驱动 抓取抖音评论数据需要用到浏览器模拟器,所以还需要安装对应的浏览器驱动。这里以Chrome为例,大家可以到Chrom…

    python 2023年6月3日
    00
  • python中对信号的处理详解

    Python中对信号的处理详解 在Python中,我们可以使用signal模块来处理信号。信号是一种软件中断,用于通知进程发生了某些事件。在本文中,我们将详细讲解Python中对信号的处理,包括信号的基本概念、信号的种类、信号的处理方式以及如何在Python中使用signal模块处理信号。 信号的基本概念 信号是一种软件中断,用于通知进程发生了某些事件。当进…

    python 2023年5月13日
    00
  • Python实现基于KNN算法的笔迹识别功能详解

    Python实现基于KNN算法的笔迹识别功能详解 简介 本文将介绍如何使用Python实现基于KNN(K-Nearest Neighbor)算法的笔迹识别功能。使用KNN算法的笔迹识别是一种基于分类的方法,可以用来将手写数字图像分类到不同的数字类中。 准备工作 在开始之前,我们需要准备以下步骤: 下载和安装Python 安装必要的Python库 下载MNIS…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部