python使用socket制作聊天室详细源码(可以直接运行)

 更新时间:2023年12月26日 10:43:13   作者:小墨蛇  
Python是一个非常灵活的编程语言,我们现在到处可见用Python编写的应用程序,下面这篇文章主要给大家介绍了关于python使用socket制作聊天室的相关资料,文中的代码可以直接运行,需要的朋友可以参考下

python 使用socket制作聊天室

1.基本前提

为什么socket能做聊天室呢

1、socket提供了通信的服务 比如你可以创建tcp udp的请求 向某个主机发起通信
就像是你想和某人说话 你得会发音
2、就是提供了服务端的方式和客户端的方式
服务端处理用户发起的请求
客户端发送数据和接收服务端的响应数据
就像你打开浏览器看视频 你作为客户端 发起请求 在某处的服务端(web服务器)会把请求接受处理
返回相应的数据 通过浏览器(客户端)接受解析 就变成了看的见的网页数据

想搞定聊天室

1.需要一个服务端提供下服务

  • 时刻接受链接进来的用户
  • 接受用户的发送信息
  • 对所有的用户发送广播 这样都能收到

2.需要多个客户端

1.链接进入聊天室
2.发送数据
3.接受广播数据

基本关系

2.服务端的搭建

1.导入socket包

创建通讯tcp等请求

导入threading包 使用线程来处理那些请求数据

import socket
import threading
#全局变量
SERVER_HOST = 'localhost'
SERVER_PORT = 8000
BUFFER_SIZE = 1024

2.创建socket的实例

tcp通信对象

socket.AF_INET, socket.SOCK_STREAM 是创建tcp的参数

百度可以了解更多 比如udp等

 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

3.绑定端口

服务的套接字 也就是IP地址+端口号

 server_socket.bind((SERVER_HOST, SERVER_PORT))
 server_socket.listen(5) # 监听 最大可以链接的数量

4.进入循环中 等待客户端的链接

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

5.把链接的客户存放起来

# 存放链接进来聊天的用户
clients = []

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

使用线程 给进入的用户分配处理函数

# 开启线程
handle_client处理函数
client_socket 参数
thread = threading.Thread(target=handle_client, args=(client_socket,))
thread.start()

handle_client的定义

1.客户端第一次进来 需要输入自己的名称

def handle_client(client_socket):
    """处理客户端连接"""
    name = client_socket.recv(BUFFER_SIZE).decode()#接受客户端发来的名称
    print(f'[*] {name} 已连接')#服务端打印查看
    welcome = f'欢迎来到聊天室, {name}!\n'.encode()
    client_socket.send(welcome)#返回给客户端 欢迎的信息

2.循环 等待用户的连天数据发送

    while True:
        msg = client_socket.recv(BUFFER_SIZE)#接受用户发来的消息 比如 你好
        #处理用户的退出
        if msg.decode() == 'quit':
            print(f'[*] {name} 断开连接')
            client_socket.close()
            break
        #向聊天室的所有人广播
        broadcast(msg, name)

broadcast定义

clients 所有的链接客户

发送谁说了什么

send(f’{name}: {msg.decode()}'.encode())
encode 是转码的意思
decode 是解码的意思

def broadcast(msg, name):
    """向所有已连接的客户端广播消息"""
    for client in clients:
        client.send(f'{name}: {msg.decode()}'.encode())

服务端总结:

  • 创建一个tcp的服务端
  • 把链接的用户存放起来
  • 第一次接受用户名字
  • while循环接受发送的信息并广播出去

3. 客户端的搭建

引入socket包

引入threading包

import socket
import threading
#全局变量
SERVER_HOST = 'localhost'
SERVER_PORT = 8000
BUFFER_SIZE = 1024

创建一个tcp通信

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

发起连接

 client_socket.connect((SERVER_HOST, SERVER_PORT))

发送自己的昵称

name = input('请输入您的昵称: ')
  # 发送昵称
name_bytes = name.encode()
client_socket.send(name_bytes)

开启线程进行聊天的处理

# 开启线程用来接收服务器发送的消息
    thread_output = threading.Thread(target=handle_output, args=(client_socket,))
    thread_output.start()

    # 开启线程用来处理用户输入的消息
    thread_input = threading.Thread(target=handle_input, args=(client_socket,))
    thread_input.start()

handle_input的定义

输入要发送的信息

def handle_input(client_socket):
    """处理用户输入"""
    while True:
        msg = input('')#输入要发送的信息
        client_socket.send(msg.encode())
        if msg == 'quit':#退出处理
            break

handle_output的定义

接受广播的数据展示出来

def handle_output(client_socket):
    """处理消息输出"""
    while True:
        msg = client_socket.recv(BUFFER_SIZE)#接收数据
        if msg.decode() == 'quit':
            break
        print(msg.decode())#展示

客户端总结

  • 发起连接
  • 进行昵称发送
  • 发送信息
  • 接受广播信息

4 完整的源码分享

服务端

import socket
import threading

SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8000
BUFFER_SIZE = 1024

def handle_client(client_socket):
    """处理客户端连接"""
    name = client_socket.recv(BUFFER_SIZE).decode()
    print(f'[*] {name} 已连接')
    welcome = f'欢迎来到聊天室, {name}!\n'.encode()
    client_socket.send(welcome)

    while True:
        msg = client_socket.recv(BUFFER_SIZE)
        if msg.decode() == 'quit':
            print(f'[*] {name} 断开连接')
            client_socket.close()
            break
        broadcast(msg, name)

def broadcast(msg, name):
    """向所有已连接的客户端广播消息"""
    for client in clients:
        client.send(f'{name}: {msg.decode()}'.encode())

if __name__ == '__main__':
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((SERVER_HOST, SERVER_PORT))
    server_socket.listen(5)
    print(f'[*] 正在听取端口 {SERVER_PORT}')

    clients = []

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

        # 开启线程
        thread = threading.Thread(target=handle_client, args=(client_socket,))
        thread.start()

客户端的代码

import socket
import threading

SERVER_HOST = 'localhost'
SERVER_PORT = 8000
BUFFER_SIZE = 1024

def handle_input(client_socket):
    """处理用户输入"""
    while True:
        msg = input('')
        client_socket.send(msg.encode())
        if msg == 'quit':
            break

def handle_output(client_socket):
    """处理消息输出"""
    while True:
        msg = client_socket.recv(BUFFER_SIZE)
        if msg.decode() == 'quit':
            break
        print(msg.decode())

if __name__ == '__main__':
    name = input('请输入您的昵称: ')
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((SERVER_HOST, SERVER_PORT))

    # 发送昵称
    name_bytes = name.encode()
    client_socket.send(name_bytes)

    # 开启线程用来接收服务器发送的消息
    thread_output = threading.Thread(target=handle_output, args=(client_socket,))
    thread_output.start()

    # 开启线程用来处理用户输入的消息
    thread_input = threading.Thread(target=handle_input, args=(client_socket,))
    thread_input.start()

5.实验测试

开启服务

客户链接

服务检测

在连接一个用户

服务检测

发送消息

广播接受

这样就能聊天了

代码还有很多地方可以改进

可以直接复制粘贴使用

总结

到此这篇关于python使用socket制作聊天室的文章就介绍到这了,更多相关python socket制作聊天室内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python面向对象编程repr方法示例详解

    Python面向对象编程repr方法示例详解

    这篇文章主要介绍了Python面向对象编程repr方法的示例详解,文中附含详细的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Opencv实现眼睛控制鼠标的实践

    Opencv实现眼睛控制鼠标的实践

    本文主要介绍了Opencv实现眼睛控制鼠标的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Python工厂模式实现封装Webhook群聊机器人详解

    Python工厂模式实现封装Webhook群聊机器人详解

    企业存在给 特定群组 自动推送消息的需求,你可以在群聊中添加一个自定义机器人,通过服务端调用 webhook 地址,即可将外部系统的通知消息即时推送到群聊中。本文就来和大家聊聊具体实现方法
    2023-02-02
  • Python Socket库基础方法与应用详解

    Python Socket库基础方法与应用详解

    这篇文章主要介绍了关于Python socket库的详细技术解析,包含基础方法说明、工作原理剖析,以及多个应用领域的完整实现代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2025-04-04
  • 基于OpenCv实现的人脸识别(附Python完整代码)

    基于OpenCv实现的人脸识别(附Python完整代码)

    人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,下面这篇文章主要给大家介绍了关于如何基于OpenCv实现的人脸识别,文中还附Python完整代码,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • python ctypes库2_指定参数类型和返回类型详解

    python ctypes库2_指定参数类型和返回类型详解

    今天小编就为大家分享一篇python ctypes库2_指定参数类型和返回类型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例

    将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例

    今天小编就为大家分享一篇将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • PyQt5中QAbstractScrollArea的详细用法教程

    PyQt5中QAbstractScrollArea的详细用法教程

    在PyQt5中,QAbstractScrollArea是一个非常重要的类,它提供了滚动区域的基本框架,允许用户通过滚动条来查看超出可视区域的内容,本文将结合具体案例,详细讲解QAbstractScrollArea的用法,需要的朋友可以参考下
    2024-08-08
  • Python实现拉格朗日插值法的示例详解

    Python实现拉格朗日插值法的示例详解

    插值法是一种数学方法,用于在已知数据点(离散数据)之间插入数据,以生成连续的函数曲线,而格朗日插值法是一种多项式插值法。本文就来用Python实现拉格朗日插值法,希望对大家有所帮助
    2023-02-02
  • python光学仿真通过菲涅耳公式实现波动模型

    python光学仿真通过菲涅耳公式实现波动模型

    这篇文章主要介绍了python光学仿真通过菲涅耳公式实现波动模型的示例解析原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10

最新评论