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来链接你的电脑。

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

创建客户端

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和端口就行了,接下来我们就来链接服务器。

图片

图片

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

保持聊天室长连接

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

服务器
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中的socket库搭建一个微型的聊天室,在里面不仅可以进行实时聊天,还可以传送文件、远程命令执行或者联网小游戏。

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

学习资源推荐
除了上述分享,学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述
👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以V扫描下方二维码联系领取
保证100%免费

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Python 的简单的聊天室的实现: ``` import socket import threading host = '127.0.0.1' port = 12345 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen() clients = [] nicknames = [] def broadcast(message): for client in clients: client.send(message) def handle(client): while True: try: message = client.recv(1024).decode('utf-8') broadcast(message) except: index = clients.index(client) clients.remove(client) client.close() nickname = nicknames[index] broadcast(f'{nickname} left the chat!'.encode('utf-8')) nicknames.remove(nickname) break def receive(): while True: client, address = server.accept() print(f'Connected with {str(address)}') client.send('NICK'.encode('utf-8')) nickname = client.recv(1024).decode('utf-8') nicknames.append(nickname) clients.append(client) print(f'Nickname of client is {nickname}!') broadcast(f'{nickname} joined the chat!'.encode('utf-8')) client.send('Connected to the server!'.encode('utf-8')) client.recv(1024) handle_thread = threading.Thread(target=handle, args=(client,)) handle_thread.start() print("Server Started!") receive() ``` 这是一个最简单的聊天室的实现,它利用了 Python 中的 socket 库来创建一个服务器,可以让多个客户端连接并互相聊天。 - `server.listen()` 表示服务器监听连接。 - `clients` 列表存储连接到服务器的客户端。 - `nicknames` 列表存储连接到服务器的客户端的昵称。 - `broadcast` 函数向所有客户端发送消息。 - `handle` 函数处理单个客户端的请求,并将其转发到其他客户端。 - `receive

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值