11
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi muốn một chức năng để kiểm tra xem dữ liệu có đang chờ trong ổ cắm được đọc trước khi đọc nó không. Một cái gì đó như thế này sẽ hữu ích:
if [data available] then read data
else wait in blocking mode till data becomes available
Làm thế nào tôi có thể đạt được điều này trong Python
hỏi ngày 29 tháng 4 năm 2014 lúc 4:48Apr 29, 2014 at 4:48
2
while 1:
socket_list = [sys.stdin, s]
# Get the list sockets which are readable
read_sockets, write_sockets, error_sockets = select.select[socket_list , [], []]
for sock in read_sockets:
#incoming message from remote server
if sock == s:
data = sock.recv[4096]
if not data :
print '\nDisconnected from server'
sys.exit[]
else :
#print data
sys.stdout.write[data]
#user entered a message
else :
msg = sys.stdin.readline[]
s.send[msg]
Đã trả lời ngày 29 tháng 4 năm 2014 lúc 8:58Apr 29, 2014 at 8:58
0
Tôi đang viết một bản cập nhật cho một trò chơi tôi đã viết bằng Python và tôi hiện đang thêm hỗ trợ máy chủ. Tôi không thể hiển thị cho bạn mã chính [cho khách hàng], vì nó dài hàng trăm dòng. Tuy nhiên, những gì tôi có thể làm là chỉ cho bạn đoạn mã này từ dòng 34 đến 47:
s = ""
serverMode = "noServer"
def getserver[server_ip,server_num]:
global s, serverMode
try:
s = socket.socket[socket.AF_INET,socket.SOCK_STREAM]
s.settimeout[2]
s.setsockopt[socket.IPPROTO_TCP, socket.TCP_NODELAY, 1]
s.connect[[server_ip,server_num]]
print "connected to " + str[server_ip]
serverMode = "activeServer"
except:
easygui.msgbox["The server is not running or does not exist."]
s = None
Biến 'S' là nơi giữ ổ cắm máy chủ. 'ServerMode' giữ thông tin về trò chơi được kết nối với máy chủ hoạt động hay không, do đó, nếu vậy, nó có thể liên tục kiểm tra các bản cập nhật trong mã. Đây là mã máy chủ, ngắn hơn đáng kể so với mã chính:
import socket, signal
print "[SERVER INFO] hosted at " + str[socket.gethostname[]]
print "[SERVER INFO] loading server..."
def doStuff[]:
pass
serversocket = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
serversocket.setsockopt[socket.SOL_SOCKET, socket.SO_REUSEADDR, 1]
serversocket.setsockopt[socket.IPPROTO_TCP, socket.TCP_NODELAY, 1]
#socket.fork[]
serversocket.bind[[socket.gethostname[], 80]]
serversocket.listen[5];
print "[SERVER INFO] server started."
clients = []
running = True
while running:
[clientsocket, address] = serversocket.accept[]
if not [clientsocket, address] in clients: clients.append[[clientsocket, address]]
data = clientsocket.recv[2048]
if not data: pass
elif data.startswith["[SERVER INFO]"]: print data
elif data == "disconnect":
pass
elif data.startswith["[BLOCK PLACEMENT]"]:
blocktype = data.split[' '][1]
loc = [data.split[' '][2], data.split[' '][3]]
for client in clients:
try: client.send[bytes["[BLOCK] " + str[loc[0]] + "," + str[loc[1]] + "," + blocktype]]
except: pass
elif data.startswith["[CHAT MESSAGE]"]:
for client in clients:
try: client.send[bytes[data]]
except: pass
clientsocket.sendall[bytes["0,0,wood.png\n20,20,wood.png"]]
serversocket.shutdown[0]
print "[SERVER INFO] server shutdown correctly."
raw_input[]
Như tôi đã đề cập, máy khách liên tục kiểm tra các bản cập nhật máy chủ. Nó sử dụng chức năng RECV trong ổ cắm. Vì vậy, vì điều này, nó chạy cực kỳ chậm. Tôi đã xem xét các hướng dẫn trực tuyến về cách khắc phục những thứ tương tự, nhưng dường như không có gì phù hợp với tôi. Tuy nhiên, đây là mã kiểm tra các bản cập nhật:
if serverMode == "activeServer":
#s.setsocketopt[socket.SOL_SOCKET, socket.SO_REUSEADDR, 1]
try:
recvbuff = 100
rx_bufftmp = s.recv[recvbuff]
rx_bufftmplen = len[rx_bufftmp]
recvbuff = max[recvbuff, rx_bufftmplen]
except: data = False
if not data == False and data.startswith['[BLOCK]']:
blk = rx_bufftmp.split[' '][1].split[',']
blx = blk[1]
bly = blk[2]
bln = blk[0]
bls.append[Block[bln, [int[blx], int[bly]]]]
Mã chạy trong Mainloop pygame. Vì vậy, vì tôi không thể tìm thấy bất kỳ cách nào để tối ưu hóa hiệu suất, thay vào đó có thể có một cách để chỉ lấy dữ liệu nếu có dữ liệu đến? Có thể cũng một số cách khác để tối ưu hóa hiệu suất là tốt?
FYI:
Tôi đang chạy phiên bản 32 bit của Python 2.7 trên bản cài đặt Windows 10 64 bit.