Hướng dẫn python socket check if data available - kiểm tra ổ cắm python nếu dữ liệu có sẵn

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

Hướng dẫn python socket check if data available - kiểm tra ổ cắm python nếu dữ liệu có sẵn

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

Hướng dẫn python socket check if data available - kiểm tra ổ cắm python nếu dữ liệu có sẵn

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.

Làm cách nào để kiểm tra trạng thái ổ cắm trong Python?

Sử dụng một câu lệnh TRY/ngoại trừ để kiểm tra ổ cắm kết nối ổ cắm. Kết nối ((ip_address, port_number)) để kiểm tra xem socket.socket có được kết nối với ip_address tại port_number không. Nếu điều này gây ra lỗi, mã trong khối ngoại trừ được thực thi.connect((ip_address, port_number)) to check if socket. socket is connected to ip_address at port_number . If this raises an error, the code in the except block is executed.

Làm thế nào để bạn kiểm tra ổ cắm được kết nối hay không?

Nếu bạn cần xác định trạng thái hiện tại của kết nối, hãy thực hiện cuộc gọi gửi không chặn, không byte.Nếu cuộc gọi trả về thành công hoặc ném mã lỗi WAEWOULDBLOCK (10035), thì ổ cắm vẫn được kết nối;Nếu không, ổ cắm không còn được kết nối.make a nonblocking, zero-byte Send call. If the call returns successfully or throws a WAEWOULDBLOCK error code (10035), then the socket is still connected; otherwise, the socket is no longer connected.

Sock_stream là gì?

Sock_stream.Cung cấp các luồng byte hai chiều, hai chiều với cơ chế truyền cho dữ liệu luồng.Loại ổ cắm này truyền dữ liệu trên cơ sở đáng tin cậy, theo thứ tự và với các khả năng ngoài băng tần.Trong miền UNIX, loại ổ cắm sock_stream hoạt động giống như một đường ống.Provides sequenced, two-way byte streams with a transmission mechanism for stream data. This socket type transmits data on a reliable basis, in order, and with out-of-band capabilities. In the UNIX domain, the SOCK_STREAM socket type works like a pipe.

Làm thế nào để bạn gửi dữ liệu từ máy khách đến máy chủ trong lập trình ổ cắm trong Python?

Overview:..
Phương thức gửi () của lớp ổ cắm của Python được sử dụng để gửi dữ liệu từ ổ cắm này sang ổ cắm khác ..
Phương thức gửi () chỉ có thể được sử dụng với một ổ cắm được kết nối.....
Phương thức gửi () có thể được sử dụng để gửi dữ liệu từ ổ cắm khách hàng dựa trên TCP đến ổ cắm được kết nối với máy khách dựa trên TCP ở phía máy chủ và ngược lại ..