python使用socket制作聊天室详细源码(可以直接运行)
作者:小墨蛇
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制作聊天室内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!