python 使用socket制作聊天室-(附带 源码 可以直接运行)

python 使用socket制作聊天室

1.基本前提

为什么socket能做聊天室呢

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

想搞定聊天室
1.需要一个服务端提供下服务

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

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())

服务端总结:

  1. 创建一个tcp的服务端
  2. 把链接的用户存放起来
  3. 第一次接受用户名字
  4. 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())#展示

客户端总结

  1. 发起连接
  2. 进行昵称发送
  3. 发送信息
  4. 接受广播信息

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.实验测试

开启服务
在这里插入图片描述
客户链接
在这里插入图片描述
服务检测
在这里插入图片描述
在连接一个用户
在这里插入图片描述
服务检测
在这里插入图片描述
发送消息
在这里插入图片描述
广播接受
在这里插入图片描述
这样就能聊天了
在这里插入图片描述

在这里插入图片描述
代码还有很多地方可以改进
可以直接复制粘贴使用

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>