Python socket C/S结构的聊天室应用实现,可以分为以下几个步骤:
- 导入socket模块。
在Python编写socket网络程序时,需要使用socket库,因此需要在代码文件顶部导入socket模块。
import socket
- 创建服务器端。
服务器端需要调用socket()方法创建一个socket对象,并指定地址和端口号,接着使用bind()方法绑定地址和端口号。如果仅仅完成这些操作,服务器依然无法正常工作,必须调用listen()方法使其进入被动监听状态,等待客户端的请求。如果有客户端发送请求,则通过accept()方法接收客户端的连接,并返回一个代表该连接的socket对象。
可以参考以下代码:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)
while True:
conn, addr = server_socket.accept()
- 创建客户端。
客户端需要调用socket()方法创建一个socket对象,接着使用connect()方法连接服务器。客户端连接服务器后,就可以向服务器发送数据,也可以接收服务器的返回结果。
可以参考以下代码:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))
while True:
message = input('请输入要发送的消息:')
client_socket.send(message.encode())
data = client_socket.recv(1024)
print('接收到服务器的返回消息为:', data.decode())
- 实现聊天室功能。
在服务器端,可以使用一个列表来存储所有已连接的客户端socket对象,每当一个客户端连接上来后,就将该客户端的socket对象添加到列表中。接着,可以使用多线程的方式来处理每个客户端的请求,在每个线程中利用send()方法将消息发给其他客户端。
在客户端可以使用input()方法从控制台获取用户输入,然后使用客户端的send()方法将消息发送给服务器。
可以参考以下代码:
服务器端代码:
import threading
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8888))
server_socket.listen(5)
client_list = []
def handle_client(client_socket, client_address):
while True:
data = client_socket.recv(1024)
message = data.decode()
if message == 'exit':
client_socket.close()
client_list.remove(client_socket)
print('客户端', client_address, '已经下线')
break
else:
print('接收到来自客户端', client_address, '的消息:', message)
for c in client_list:
if c != client_socket:
try:
c.send(data)
except:
pass
while True:
client_socket, client_address = server_socket.accept()
client_list.append(client_socket)
thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
thread.start()
客户端代码:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8888))
while True:
message = input('请输入要发送的消息:')
client_socket.send(message.encode())
if message == 'exit':
client_socket.close()
break
data = client_socket.recv(1024)
print('接收到服务器的返回消息为:', data.decode())
两条示例说明:
-
在客户端发送消息时,可以通过输入“exit”来退出聊天室。当客户端输入“exit”时,服务器会将该客户端的socket对象从列表中移除,然后关闭该客户端的socket连接。
-
在客户端接收服务器返回结果时,可以使用try-except语句来处理异常情况,例如当客户端与服务器的连接断开时,客户端无法接收到服务器的返回结果,此时需要捕获异常并进行相应处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python socket C/S结构的聊天室应用实现 - Python技术站