python 高并发 select socket_python – 使用select处理多个请求
目前我正在開發(fā)一個(gè)聊天服務(wù)器/客戶端項(xiàng)目.
我正在努力處理使用select的多個(gè)請(qǐng)求,我的服務(wù)器腳本使用select模塊但客戶端腳本沒有.結(jié)果是,當(dāng)用戶輸入消息時(shí),其他客戶端必須編寫自己的消息以通讀對(duì)話.我在網(wǎng)上搜索了很多例子,但是只能找到sys.stdin的代碼片段,這不是我想要的.
我很樂意接受任何指示/解釋.
服務(wù)器代碼:
import socket
import select
server_socket = socket.socket()
server_socket.bind(("0.0.0.0", 2855))
server_socket.listen(1)
open_client_sockets = [] # current clients handler
messages_to_send = [] # future message send handler
def send_waiting_messages(wlist):
for message in messages_to_send:
(client_socket, data) = message
if client_socket in wlist: # if current socket in iteration has reading abilities
client_socket.send(data)
messages_to_send.remove(message) # remove from future send handler
def broadcast_message(sock, message):
for socket in open_client_sockets:
if socket != server_socket and socket != sock:
socket.send(message)
while True:
rlist, wlist, xlist = select.select([server_socket] + open_client_sockets, open_client_sockets, []) # apending reading n writing socket to list
for current_socket in rlist: # sockets that can be read
if current_socket is server_socket: # if there is a new client
(new_socket, address) = server_socket.accept()
open_client_sockets.append(new_socket) # clients list
else:
data = current_socket.recv(1024)
if len(data) == 0:
open_client_sockets.remove(current_socket) # remove user if he quit.
print "Connection with client closed."
send_waiting_messages(wlist) # send message to specfic client
else:
broadcast_message(current_socket, "" + ' ')
# send_waiting_messages(wlist) # send message to specfic client
server_socket.close()
客戶代碼:
import socket
import msvcrt
client_socket = socket.socket()
client_socket.connect(("127.0.0.1", 2855))
data = ""
def read_message():
msg = ""
while True:
if msvcrt.kbhit():
key = msvcrt.getch()
if key == '': # Enter key
break
else:
msg = msg + "" + key
return msg
while data != "quit":
data = read_message()
client_socket.send(data)
data = client_socket.recv(1024)
print data
client_socket.close()
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python 高并发 select socket_python – 使用select处理多个请求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssm把图片保存到项目中_项目中的图片跨
- 下一篇: python输入y继续运行_python