python编写简易聊天室实现局域网内聊天功能

下面是详细讲解 "Python编写简易聊天室实现局域网内聊天功能" 的完整攻略。

1. 确定需求

在开始编写简易聊天室之前,首先需要明确需求,包括:

  • 局域网内聊天:聊天室应该只能在局域网内使用,不能通过互联网访问。
  • 实现简单:聊天室应该实现基本的聊天功能,同时代码实现应该尽可能简单。
  • 支持多人聊天:聊天室应该支持多人同时聊天,任何人发出的消息都应该在所有人的聊天窗口中显示。

2. 创建聊天室服务端

使用Python的socket模块创建一个简单的聊天室服务端,代码如下:

import socket

host = socket.gethostname()
port = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen()

print(f"Server listen on {host}:{port}")

while True:
    client_socket, addr = server_socket.accept()

    print(f"New connection from {addr[0]}:{addr[1]}")

在上面的代码中,我们使用socket模块创建了一个server_socket对象,并将其绑定到本地计算机的host和端口号port上。然后使用listen()方法开始监听客户端的连接请求。当客户端连接请求到达时,accept()方法将会返回一个客户端的socket对象和一个客户端的地址(IP和端口号)。

3. 创建聊天室客户端

和服务端类似,我们也可以使用Python的socket模块创建一个简单的聊天室客户端,代码如下:

import socket

host = socket.gethostname()
port = 9999
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))

while True:
    message = input("> ")
    client_socket.send(message.encode("utf-8"))

在上面的代码中,我们使用socket模块创建了一个client_socket对象,并将其连接到服务端的host和端口号port上。然后,在一个无限循环中,用户可以输入聊天信息,并通过send()方法将其发送到服务端。请注意,在这个简单的模型中,每个客户端都是一个独立的进程。

4. 实现广播机制

现在你的聊天室已经支持了单个客户端发送消息到服务端。接下来,你需要实现广播机制,以便在服务端接收到任何一个客户端的消息时,能够将此消息广播到所有连接到服务端的客户端。

修改服务端的代码如下:

import socket

host = socket.gethostname()
port = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen()

print(f"Server listen on {host}:{port}")

while True:
    client_socket, addr = server_socket.accept()

    print(f"New connection from {addr[0]}:{addr[1]}")

    while True:
        message = client_socket.recv(1024).decode("utf-8")
        if not message:
            break
        print(f"Message from {addr[0]}:{addr[1]}: {message}")
        for socket in client_sockets:
            socket.send(f"{addr[0]}:{addr[1]}: {message}".encode("utf-8"))

    client_sockets.remove(client_socket)
    client_socket.close()

在上面的代码中,我们为每个客户端的连接创建一个单独的线程。在这个线程中,我们使用一个无限循环监视客户端,等待客户端发送消息到服务端。当服务端接收到任何客户端的消息时,它将使用for循环循环遍历当前所有连接到服务端的客户端,并使用send()方法将此消息发送到每个客户端。

5. 实现多客户端连接

现在你的聊天室已经实现了广播功能。但是,目前仍然只允许一个客户端连接到服务端。要实现多个客户端连接,你需要做以下几个步骤:

  • 修改服务端代码,将客户端的socket对象存储在一个列表中。
  • 修改广播机制,使每个客户端都能接收到其他客户端发送的消息。
  • 在客户端代码中循环等待用户输入消息,并将其发送到服务端。

这些修改后的代码如下所示:

服务端代码:

import socket

host = socket.gethostname()
port = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen()

print(f"Server listen on {host}:{port}")

client_sockets = []

while True:
    client_socket, addr = server_socket.accept()

    print(f"New connection from {addr[0]}:{addr[1]}")
    client_sockets.append(client_socket)

    while True:
        message = client_socket.recv(1024).decode("utf-8")
        if not message:
            break
        print(f"Message from {addr[0]}:{addr[1]}: {message}")
        for socket in client_sockets:
            socket.send(f"{addr[0]}:{addr[1]}: {message}".encode("utf-8"))

    client_sockets.remove(client_socket)
    client_socket.close()

客户端代码:

import socket

host = socket.gethostname()
port = 9999

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))

while True:
    message = input("> ")
    client_socket.send(message.encode("utf-8"))

使用以上代码可实现局域网内简易聊天室的基本功能。

示例

以下是两个示例,展示如何使用以上代码创建简易聊天室。

示例1:使用控制台创建简易聊天室

  1. 打开命令提示符(Windows)或终端(macOS / Linux)并将路径更改为聊天室程序所在的文件夹。
  2. 启动服务端,使用以下命令:

python server.py

  1. 打开另一个终端窗口或命令提示符窗口,将其路径更改为聊天室程序所在的文件夹。
  2. 启动一个客户端,使用以下命令:

python client.py

  1. 打开第三个终端窗口或命令提示符窗口,并启动另一个客户端,使用以下命令:

python client.py

  1. 输入任何一台客户端(终端)的窗口,即可发送消息到所有的客户端。

示例2:使用 Python IDLE 创建简易聊天室

  1. 打开 Python IDLE,并创建一个新的 Python 文件。
  2. 将以下服务端代码复制并粘贴到新文件里:

```python
import socket

host = socket.gethostname()
port = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen()

print(f"Server listen on {host}:{port}")

client_sockets = []

while True:
client_socket, addr = server_socket.accept()

   print(f"New connection from {addr[0]}:{addr[1]}")
   client_sockets.append(client_socket)

   while True:
       message = client_socket.recv(1024).decode("utf-8")
       if not message:
           break
       print(f"Message from {addr[0]}:{addr[1]}: {message}")
       for socket in client_sockets:
           socket.send(f"{addr[0]}:{addr[1]}: {message}".encode("utf-8"))

   client_sockets.remove(client_socket)
   client_socket.close()

```

  1. 将以下客户端代码复制并粘贴到一个新的 Python 文件中:

```python
import socket

host = socket.gethostname()
port = 9999

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))

while True:
message = input("> ")
client_socket.send(message.encode("utf-8"))
```

  1. 在 Python IDLE 中运行服务端程序,使用菜单栏打开 File -> Open 并打开服务端文件所在的文件夹,选择服务端文件(如 server.py),并点击 Run 即可。
  2. 在 Python IDLE 中打开另一个文件,使用菜单栏打开 File -> Open 并打开客户端文件所在的文件夹,选择客户端文件(如 client.py),并点击 Run 即可。
  3. 打开第三个文件,进行步骤五,再次点击 Run 即可。
  4. 现在可以在客户端窗口中输入任何聊天消息,然后将此消息广播到所有连接到聊天室的客户端。

最后,需要注意的是,这只是一个简单的聊天室实现,必须小心处理潜在的安全问题,例如防止恶意代码通过服务端攻击其他客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python编写简易聊天室实现局域网内聊天功能 - Python技术站

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

相关文章

  • 深入解答关于Python的11道基本面试题

    深入解答关于Python的11道基本面试题 在本篇文章中,我们将深入探讨Python的11道基本面试题。每个问题都将会被仔细解释,并提供两个示例,用于更好地理解问题和解决方法。 面试问题一:“Python中的元组(tuple)和列表(list)有什么区别?” 元组和列表都是Python中最基本的数据结构之一。但是它们之间有些许不同之处。 元组与列表的不同点:…

    python 2023年5月13日
    00
  • Python映射类型之dict详解

    Python映射类型之dict详解 简介 dict是Python内置的一种映射类型,也叫字典,是一个键值对的无序集合。这里的“键”必须是唯一的。 定义和初始化 定义一个空的字典: d = {} 初始化一个字典: d = {‘name’: ‘张三’, ‘age’: 20} 也可以使用dict()函数初始化: d = dict(name=’张三’, age=20…

    python 2023年5月13日
    00
  • python如何获取当前文件夹下所有文件名详解

    获取当前文件夹下所有文件名是一项常用的任务,Python提供了方便的方式来实现这个功能。 方法一:使用os.listdir()函数 Python中的os模块提供了许多方便的文件和目录操作函数,其中os.listdir()函数可以列出当前目录中的所有文件和子目录。 import os # 获取当前文件夹下所有文件名 file_list = os.listdir…

    python 2023年6月2日
    00
  • python 并发编程 非阻塞IO模型原理解析

    Python并发编程非阻塞IO模型原理解析 在Python中,非阻塞IO模型是一种常用的并发编程技术。本文将为您详细讲解Python并发编程非阻塞IO模型的原理,包括阻IO模型、非阻塞IO模型、IO多路复用模型等。同时,本文还将提供两个示例说明。 阻塞模型 在阻塞IO模型中,当一个线程执行IO操作时,它一直等待,直到IO操作完成。在这个过程,线程会被阻塞,无…

    python 2023年5月14日
    00
  • python删除文件、清空目录的实现方法

    下面是Python删除文件、清空目录的实现方法的详细攻略。 删除文件 Python中删除文件可以使用os模块中的os.remove()函数。它接收文件路径作为参数,删除该路径下的文件。 示例: import os file_path = ‘./test.txt’ os.remove(file_path) # 删除文件 需要注意的是,当被删除的文件不存在时,o…

    python 2023年6月2日
    00
  • Python符号计算之实现函数极限的方法

    Python 符号计算之实现函数极限的方法 本文将介绍如何使用 Python 中的符号计算工具 SymPy 来计算和求解函数的极限。SymPy 提供了一系列用于符号计算的函数和类,让我们可以直接对符号表达式进行数学计算。 使用 SymPy 来计算函数极限的主要步骤如下: 导入 SymPy 模块,并创建符号变量; 定义待求极限的函数表达式; 使用 limit(…

    python 2023年6月5日
    00
  • Python 实现网课实时监控自动签到、打卡功能

    关于 Python 实现网课实时监控自动签到、打卡功能的完整攻略,我将从以下几个方面进行详细讲解: 需要用到的工具和技术 网课平台的登录与自动化操作 签到与打卡功能的实现 示例说明 1. 需要用到的工具和技术 在实现网课实时监控自动签到、打卡功能时,需要用到的工具和技术主要包括: Python解释器:安装Python解释器可以到官方网站下载(https://…

    python 2023年5月19日
    00
  • Python之字典添加元素的几种方法

    下面是Python之字典添加元素的几种方法的完整攻略。 字典添加元素的几种方法 在Python中,字典是一种非常常见的数据类型。字典可以存储键值对,其中每个键都指向一个值。字典是可变的,即可以添加、修改、删除字典中的元素。 1. 使用赋值符号添加元素 字典添加元素最简单的方法就是使用赋值符号来将一个键值对直接赋值给字典。示例代码如下所示: >>&…

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