Я попал в тупиковую ситуацию с моим простым тестом socketserver / client.См. Код
import pickle, json, socket, socketserver, threading
class ServerHandler(socketserver.BaseRequestHandler):
def __init__(self, request, client_address, server):
self.message = b''
socketserver.BaseRequestHandler.__init__(self, request, client_address, server)
def handle(self):
while True:
try:
# STUCK here when data is fully received.
data = self.request.recv(1024)
# STUCK end
if data is not None:
if len(data) > 0:
self.message += data
else:
break
else:
break
except:
break
self.request.send(self.message)
if __name__ == '__main__':
address = ('localhost', 10000)
server = socketserver.TCPServer(address, ParameterHandler)
ip, port = server.server_address
th = threading.Thread(target=server.serve_forever)
th.setDaemon(True)
th.start()
# Client
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect((ip, port))
s.settimeout(0.2)
message = pickle.dumps(json.loads(open('test.json').read()))
lenSent = s.send(message)
server.shutdown()
s.close()
server.socket.close()
Из того, что я вижу, мой сервер, вероятно, не знает, что получил полные данные.Так что следующий self.request.recv()
звонок застревает.Но почему это не исключение?или почему он просто не может вернуть None
, если не получено никаких действительных данных?
Я пытаюсь использовать socketserver
, чтобы избавить от необходимости писать сервер сокетов с нуля, но я не понимаю этогомодуля пока нет.