基于 socket 的聊天室服务器与客户端实现解释一下怎么实现
实现一个基于 socket 的聊天室服务器与客户端,可以分为以下几个步骤:
- 创建服务器端和客户端的 socket 对象,并设定通信协议、IP 地址和端口号。
- 服务器端 socket 对象绑定端口,并监听客户端连接请求,客户端 socket 对象连接服务器端。
- 服务器端接受客户端消息,并将消息广播给所有已连接的客户端。
- 客户端发送消息给服务器端,并接收服务器端广播的消息。
下面是具体实现的步骤:
- 创建服务器端和客户端的 socket 对象,并设定通信协议、IP 地址和端口号。
服务器端代码:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
print('等待客户端连接...')
客户端代码:
import socket
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口号
client_socket.connect((host, port))
print('连接成功!')
- 服务器端 socket 对象绑定端口,并监听客户端连接请求,客户端 socket 对象连接服务器端。
服务器端代码:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
print('等待客户端连接...')
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print('连接地址:', addr)
# 发送欢迎消息给客户端
message = '欢迎加入聊天室!'
client_socket.send(message.encode('utf-8'))
客户端代码:
import socket
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口号
client_socket.connect((host, port))
print(client_socket.recv(1024).decode('utf-8'))
- 服务器端接受客户端消息,并将消息广播给所有已连接的客户端。
服务器端代码:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
print('等待客户端连接...')
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print('连接地址:', addr)
# 发送欢迎消息给客户端
message = '欢迎加入聊天室!'
client_socket.send(message.encode('utf-8'))
while True:
# 接收客户端消息
message = client_socket.recv(1024).decode('utf-8')
if message:
print('收到消息:', message)
# 广播消息给所有已连接的客户端
for socket in sockets:
if socket != server_socket and socket != client_socket:
try:
socket.send(message.encode('utf-8'))
except:
sockets.remove(socket)
客户端代码:
import socket
import threading
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口号
client_socket.connect((host, port))
print(client_socket.recv(1024).decode('utf-8'))
# 接收服务器端消息的线程函数
def receive_message():
while True:
message = client_socket.recv(1024).decode('utf-8')
if message:
print(message)
# 启动接收消息的线程
threading.Thread(target=receive_message).start()
# 发送消息给服务器端
while True:
message = input()
client_socket.send(message.encode('utf-8'))
- 客户端发送消息给服务器端,并接收服务器端广播的消息。
客户端代码:
import socket
import threading
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口号
client_socket.connect((host, port))
print(client_socket.recv(1024).decode('utf-8'))
# 接收服务器端消息的线程函数
def receive_message():
while True:
message = client_socket.recv(1024).decode('utf-8')
if message:
print(message)
# 启动接收消息的线程
threading.Thread(target=receive_message).start()
# 发送消息给服务器端
while True:
message = input()
client_socket.send(message.encode('utf-8'))
服务器端代码:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
print('等待客户端连接...')
# 存储已连接的客户端 socket 对象
sockets = []
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print('连接地址:', addr)
# 发送欢迎消息给客户端
message = '欢迎加入聊天室!'
client_socket.send(message.encode('utf-8'))
# 将客户端 socket 对象存入列表中
sockets.append(client_socket)
while True:
# 接收客户端消息
message = client_socket.recv(1024).decode('utf-8')
if message:
print('收到消息:', message)
# 广播消息给所有已连接的客户端
for socket in sockets:
if socket != server_socket and socket != client_socket:
try:
socket.send(message.encode('utf-8'))
except:
sockets.remove(socket)
``
原文地址: https://www.cveoy.top/t/topic/emyk 著作权归作者所有。请勿转载和采集!