[英]Cannot receive data from server using socket.recv()
我有一個 python 客戶端,它以 json 格式將一些數據(命名空間、metric_name、時間戳、metric_value、維度)發送到 java 服務器並接收響應。
這是客戶端代碼的一部分:
def _init_socket(self):
logger.info("initial socket, hostname {}, port {}".format(self.host, self.port))
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = (self.host, self.port)
client.connect(address)
self.client = client
def send_put_metrics_request(self, namespace, metric_name, metric_value, dimensions):
try:
self._init_socket()
timestamp = int(round(time.time() * 1000))
send_data = self.convert_to_json(namespace, metric_name, timestamp, metric_value, dimensions)
self.client.send(bytes(send_data + "\n", encoding=self.encoding))
self.client.shutdown(socket.SHUT_WR)
data = self.client.recv(1024)
print(data)
finally:
self.client.close()
在服務器端,我只想將 HelloWorld 返回給客戶端。 這是java服務器代碼的一部分:
public void start() {
logger.info("Daemon Server is listening for metrics");
try (final ServerSocket serverSocket = new ServerSocket()) {
final int port = 7072;
serverSocket.bind(new InetSocketAddress(port));
while (true) {
final Socket socket = serverSocket.accept();
threadPool.submit(() -> process(socket));
}
} catch (final Exception e) {
logger.error(Thread.currentThread().getId() + " failed to make a connection to the server socket"
+ e.getMessage());
throw new ConnectToServerSocketException(Thread.currentThread().getId()
+ " failed to make a connection to the server socket" + e.getMessage());
} finally {
threadPool.shutdown();
}
}
protected void process(final Socket socket) {
final Message message;
try (final InputStream input = socket.getInputStream()) {
final OutputStream output = socket.getOutputStream();
final OutputStreamWriter osw = new OutputStreamWriter(output, "UTF8");
final PrintWriter writer = new PrintWriter(new BufferedWriter(osw));
message = objectMapper.readValue(inputStreamToString(input), Message.class);
// pls ignore the below line, it just calls another method to do something
final String res = forwardMetrics(message);
logger.info("Thread " + Thread.currentThread().getId() + " processed result: " + res);
writer.println("HelloWorld"+"\n");
writer.flush();
socket.close();
logger.info("Socket closed")
} catch (final IOException e) {
logger.error(e.getMessage());
logger.error("Daemon server failed to read input from socket");
throw new ReadFromSocketException("Failed to read input from socket", e);
}
}
然后在我啟動服務器並通過客戶端以正確的格式發送請求之后。 我沒有從客戶端得到“HelloWorld”。 打印結果只是b' ' 。 從服務器端的日志來看,它執行所有行,直到套接字關閉。
我想知道為什么沒有打印出來。
不保證客戶端中的socket.recv()
會在第一次獲取時返回響應。 我建議你在 while 循環中調用recv()
直到它收到None
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.