2

クライアントがリクエストメッセージをサーバーに送信し、応答を待つPythonのサーバーとクライアントコードがあります。クライアントが適切なリクエストを送信しない場合に接続を閉じるサーバーコードがあります。サーバーがリクエストを閉じても、クライアントは引き続きレスポンスを永遠にリッスンします。

以下はコードです

サーバー.py

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host, port))

s.listen(1)

while True:

  c, addr = s.accept()

  # Receive request
  data = c.recv(1024)
  if data != 'something'
    c.close()
  else
    c.sendall("message"+"End")
    c.close()
s.close()

Client.py

End='End'
def recv_end(the_socket):
  # Snippet from http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/
  total_data=[];data=''
  while True:
    data=the_socket.recv(8192)
    if End in data:
      total_data.append(data[:data.find(End)])
      break
    total_data.append(data)
    if len(total_data)>1:
      #check if end_of_data was split
      last_pair=total_data[-2]+total_data[-1]
      if End in last_pair:
        total_data[-2]=last_pair[:last_pair.find(End)]
        total_data.pop()
        break
  return ''.join(total_data)

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host, port))

s.send("some_request")
data = s.recv_end(1024)
print "<---- " + str(data)

s.close()

私はpythonが初めてで、サーバーが接続を閉じて終了したことをクライアントが知る方法があるかどうか疑問に思っています。

通常を使用すると、クライアントが切断されることを理解していますs.recv(1024)。しかし、私の場合、クライアントに大きなデータを送信する必要があるため、http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-から見つけた別の関数を使用しました。 into-recvall/ .

サーバーが接続のクローズ中に空の文字列の応答を送信するようなものですか?私の場合、エンドリミッターなしで空の文字列を送信するため、クライアントは永遠にリッスンしていますか?

4

1 に答える 1

3

ソケットやパイプから読み取るループがある場合はrecv、 len 0 のバッファを取得したらすぐに読み取りを停止する必要があります。

while True:
    data=the_socket.recv(8192)
    if len(data) == 0: break
    ...
于 2014-11-18T17:15:37.760 に答える