Я написал пользовательский Python клиент и сервер, который обменивается данными через TCP-сокеты:
- Клиент подключается к серверу
- Клиент бездействует, пока сервер не отправит пользовательскую команду клиент (например, сервер отправляет количество секунд, в течение которых он хочет, чтобы клиент спал)
- Клиент выполняет команду (что-то вроде time.sleep (5))
- Клиент отправляет ответ обратно когда сервер завершит выполнение команды
- Go до шага 2 и повторите команду
способ отправки и получения данных сокета выглядит следующим образом:
- Создание сообщения в виде JSON строки
- Чтение / запись длины сообщения в сокет (при чтении клиент / сервер будет зависать до получения сообщения, что нормально для моего варианта использования)
- Чтение / запись сообщения в сокет (так как длина известна, мы знаем, сколько байтов нам нужно прочитать из сокета, чтобы получить все сообщение)
Я попытался написать сервер использует Node.JS и kee пинговать клиента в Python (у меня нет JS опыта):
var net = require('net');
var server = net.createServer(function(socket) {
console.log('Connected:', socket.remoteAddress, ':', socket.remotePort);
while (true) {
// Send a custom command to the client
values = prepareMessage({ 'command' : 'sleep', 'time' : '5' })
socket.write(values[0]);
socket.write(values[1]);
// Wait for client to execute the command and receive response
res = socket.read(32); // Message length is at most 32 bits
while(res == null) {
res = socket.read(32);
console.log('Wait for message length');
}
console.log('Message length received, now read message');
message = socket.read(res);
}
});
server.listen(1337, '127.0.0.1');
/*
Converts message from dictionary to a correct format to pass onto the client
*/
function prepareMessage(msg) {
var message = JSON.stringify(msg);
var message_length = (message.length).toString(2);
// Make the message contain 32 bits
while(message_length.length < 32) {
message_length = "0" + message_length;
}
return [message_length, message];
}
Проблема в том, что мой метод socket.read()
постоянно возвращает null
, независимо от того, что я ему отправляю. Есть ли способ конвертировать мой python код сервера в этот?