脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python系列:摸鱼小利器,使用Python创建一个聊天室

Python系列:摸鱼小利器,使用Python创建一个聊天室

2024-01-18 14:29Python都知道 Python

今天就来介绍如何使用Python中的socket库搭建一个微型的聊天室,在里面不仅可以进行实时聊天,还可以传送文件、远程命令执行或者联网小游戏。

上班是帮老板赚钱,摸鱼才是赚老板的钱。

日常摸鱼跟小伙伴聊天是我们经常干的事儿,但是对于有些位置不好的同学,背对领导或者坐在过道中的,就需要时刻盯防经过的人,以防自己上班聊天划水摸鱼被抓现行,那么今天就来介绍如何使用Python创建一个聊天室。

Python系列:摸鱼小利器,使用Python创建一个聊天室

socket介绍

在网络编程中,Socket 是一种通信机制,允许计算机在网络上相互通信。Python 中的 socket 库提供了一种简单而强大的方式来创建网络应用程序,本文将介绍socket库的基本概念、创建和使用套接字(Socket)的方法以及一些常见的网络编程用例。

基本概念

Socket 是一种通信的端点,可以通过网络发送和接收数据。在网络编程中,通常使用两种类型的Socket:服务器端套接字和客户端套接字。服务器端套接字等待来自客户端的连接请求,而客户端套接字尝试与服务器端建立连接。

创建服务器

import socket


# 创建服务器端套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

# 监听连接请求
server_socket.listen(5)

print('Waiting for client to connect...')

# 接受客户端连接
client_socket, client_address = server_socket.accept()
print('Connection from:', client_address)

# 接收数据
data = client_socket.recv(1024)
print('Received:', data.decode())

# 发送数据
message = 'Hello, client!'
client_socket.send(message.encode())

# 关闭连接
client_socket.close()
server_socket.close()

通过上面的代码我们成功出创建了一个聊天室的服务器,其中的ip可以替换成你自己电脑的ip地址,这样比人就可以通过IP:Port来链接你的电脑。

Python系列:摸鱼小利器,使用Python创建一个聊天室

运行后我们可以看到服务器目前正在等待连接中,接下来我们就创建客户端来链接服务器。

创建客户端

import socket

# 创建客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)

# 发送数据
message = 'Hello, server!'
client_socket.send(message.encode())

# 接收数据
data = client_socket.recv(1024)
print('Received:', data.decode())

# 关闭连接
client_socket.close()

通过上面的代码我们已经成功创建好了客户端,链接服务器地址哪里修改成服务器的对应IP和端口就行了,接下来我们就来链接服务器。

Python系列:摸鱼小利器,使用Python创建一个聊天室

Python系列:摸鱼小利器,使用Python创建一个聊天室

可以看到运行客户端后我们可以看到服务端和客户端都有反应,服务端收到客户端的连接后发送了一天消息,客户端同时也收到了服务端发来的消息,这两条消息是我们指定的,并且发送一条后聊天室就关闭,接下来我们来优化一下

保持聊天室长连接

这里我们使用多线程来创建一个持久性连接的聊天室。

服务器:

import socket
import threading

def handle_client(client_socket):
    while True:
        # 接收客户端消息
        data = client_socket.recv(1024)
        if not data:
            break  # 如果客户端断开连接,退出循环
        message = data.decode()
        print(f"Received from {client_socket.getpeername()}: {message}")

        # 广播消息给所有客户端
        broadcast(message, client_socket)

    # 关闭连接
    print(f"Connection from {client_socket.getpeername()} closed.")
    clients.remove(client_socket)
    client_socket.close()

def broadcast(message, sender_socket):
    for client in clients:
        if client != sender_socket:
            try:
                client.send(message.encode())
            except:
                # 如果发送失败,说明客户端已断开连接,移除该客户端
                clients.remove(client)

# 创建服务器端套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

# 监听连接请求
server_socket.listen(5)

print('Waiting for clients to connect...')

# 存储所有客户端套接字的列表
clients = []

while True:
    # 接受客户端连接
    client_socket, client_address = server_socket.accept()
    print(f"Connection from {client_address} established.")

    # 存储客户端套接字到列表
    clients.append(client_socket)

    # 创建一个线程来处理客户端
    client_handler = threading.Thread(target=handle_client, args=(client_socket,))
    client_handler.start()

客户端:

import socket
import threading

def receive_messages():
    while True:
        try:
            # 接收服务器端消息
            data = client_socket.recv(1024)
            if not data:
                break  # 如果服务器端断开连接,退出循环
            message = data.decode()
            print("Received:", message)
        except:
            break

# 创建客户端套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)

# 创建一个线程来接收服务器端消息
receive_thread = threading.Thread(target=receive_messages)
receive_thread.start()

# 发送消息到服务器
while True:
    message = input("我是客户端1: ")
    client_socket.send(message.encode())

这里注意,服务器和客户端是存在不同的py文件中的,就是说如果几个人中需要一个人创建服务区和聊天室的话就需要创建两个py文件。

然后其他小伙伴就只需要创建一个聊天室就行了,在客户端中的message标明你是谁就行,接下来我们开始实验。

Python系列:摸鱼小利器,使用Python创建一个聊天室

Python系列:摸鱼小利器,使用Python创建一个聊天室

Python系列:摸鱼小利器,使用Python创建一个聊天室

这里可以看到我们成功搭建了一个微型聊天室,每个客户端都能收到其他客户发送的消息,而服务端可以看到所有客户端所发送的消息。

以上就是使用Python中的socket库搭建一个微型的聊天室,在里面不仅可以进行实时聊天,还可以传送文件、远程命令执行或者联网小游戏。

当然我给出的示例只是一个简单的多线程聊天室的示例,只是用于娱乐,如果想要在项目中实际应用则需要考虑到更多的安全性和错误的处理,如果需要更高级的异步处理,还会用到asyncio。

原文地址:https://mp.weixin.qq.com/s?__biz=MzkwMDE4NzE5OQ==&mid=2247502425&idx=1&sn=74b724c2ea5425df558cd5778e2c163e

延伸 · 阅读

精彩推荐
  • PythonPython 如何对文件目录操作

    Python 如何对文件目录操作

    这篇文章主要介绍了Python 如何对文件目录操作,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下 ...

    Alan.hsiang3942020-07-10
  • Pythonpandas值替换方法

    pandas值替换方法

    今天小编就为大家分享一篇pandas值替换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Johnny_Cuii11522021-03-15
  • PythonPython使用剪切板的方法

    Python使用剪切板的方法

    这篇文章主要为大家详细介绍了Python使用剪切板的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Jackeriss5912020-11-15
  • Pythonpython通过函数属性实现全局变量的方法

    python通过函数属性实现全局变量的方法

    这篇文章主要介绍了python通过函数属性实现全局变量的方法,实例分析了Python中函数属性的相关使用技巧,需要的朋友可以参考下 ...

    秋风秋雨4572020-06-29
  • PythonPython直接赋值及深浅拷贝原理详解

    Python直接赋值及深浅拷贝原理详解

    这篇文章主要介绍了Python直接赋值及深浅拷贝原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    yaominghui4352020-09-05
  • PythonPython模拟浏览器上传文件脚本的方法(Multipart/form-data格式)

    Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)

    今天小编就为大家分享一篇Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看...

    lykops5812021-04-10
  • PythonPython自定义函数计算给定日期是该年第几天的方法示例

    Python自定义函数计算给定日期是该年第几天的方法示例

    这篇文章主要介绍了Python自定义函数计算给定日期是该年第几天的方法,结合具体实例形式分析了Python日期时间计算相关操作技巧,需要的朋友可以参考下...

    xuezhangjun5532021-06-30
  • Pythonpython实现数据图表

    python实现数据图表

    plotly是现代平台的敏捷商业智能和数据科学库,它作为一款开源的绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行...

    orientlu5812020-11-29