6

私は非常に単純なPythonソケットサーバーに取り組んでいます。ノンブロッキングソケットを使用しています。サーバーとクライアントは、Python2.7.3を搭載したWindows7x64で実行されています。これが私がクライアントからデータを受け取るコードです:

def listenToSockets(self):

    while True:

        changed_sockets = self.currentSockets

        ready_to_read, ready_to_write, in_error = select.select(changed_sockets,[],[])

        for s in ready_to_read:
            # if its the server master socket someone is connecting
            if s == self.socket:
                (client_socket, address) = s.accept()
                print "putting " + address[0] + " onto connections\n";
                client_socket.setblocking(0)

                self.currentSockets.append(client_socket)
                print "current client count : " + str(len(self.currentSockets) - 1)

            else:

                data = ''
                try:

                    while True:
                        part = s.recv(4096)
                        if part != '':
                            data = data + part
                        elif part == '':
                            break


                except socket.error, (value,message): 
                    print 'socket.error - ' + message


                if data != '':
                    print "server received "+data
                else:
                    print "Disconnected "+str(s.getsockname())

                    self.currentSockets.remove(s)
                    s.close()

そして、これがクライアントが何度も何度もデータを送信しているところです:

#client example
import socket
import time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.0.41', 9999))


while 1:
    client_socket.send("test")
    time.sleep(2) 

サーバーが「テスト」というメッセージを何度も受信しているのがわかります。しかし、受信したものを出力する前に、次のエラーメッセージが表示されます。

socket.error - A non-blocking socket operation could not be completed immediately.

明らかに例外がスローされpart = s.recv(4096)ますが、なぜですか?

4

1 に答える 1

12

それはまさにノンブロッキングソケットが行うことになっていることです。

  • 利用可能なデータがある場合はそれを読みます
  • 利用できるものがない場合は、ブロックするのではなくエラーを発生させます

そのため、受信しようとするたびに例外が発生し、利用可能なデータがありません。

于 2013-03-19T20:24:23.430 に答える