2016-04-05 2 views
0

Есть ли возможность проверить, работает ли сокет net (т. Е .: активно отправлять или получать данные)? Я проверил documentation, но я не мог найти ничего связанного.Проверьте, не работает ли сетевое гнездо узла

В моем случае у меня есть открытый сокет между клиентом сокета и сервером узлов. Когда клиент HTTP делает запрос, сервер связывается под капотом с клиентом сокета.

Проблема в том, что если list-files в настоящее время выполняется, и я запрашиваю rename-file, операция блокируется первым запросом. Мое решение состоит в том, чтобы иметь несколько открытых сокетов между сервером узлов и сокет-клиентом, чтобы распараллелить запросы.

Чтобы узнать, какой сокет я могу использовать для запроса, мне нужно знать, если он простаивает или работает уже по другому запросу (например, особенно при загрузке/загрузке файла).

var clientSockets = [] 

router.post('/list-files', function(req, res) { 
    var clientSockets = clientSockets.filter(function(currSocket) { 
     return currSocket.userID === "[email protected]" 
    }) 

    // What should I do here? 
    // var availableClientSocket = clientSockets.filter(

    writeMessageToSocket(availableClientSocket, socketReq.fromHttpReq(req)) 
    readMessageFromSocket(availableClientSocket, socketRes) 

    res.write(socketRes) 
} 

router.post('/rename-file', function(req, res) { 
    // ... 
} 

ответ

0

Вы могли бы дать каждому сокету идентификатор и добавить массив workingSockets:

var clientSockets = [] 
var workingSockets = [] 

router.post('/list-files', function(req, res) { 
    var availableSocket; 
    for(var i = 0; i < clientSockets.length; i++) { 
     for(var k = 0; k < workingSockets.length; k++) { 
      if(workingSockets[k] === clientSockets[i].id) return 
     } 
     if(clientSockets[i].socket.userID === "[email protected]") availableSocket = clientSockets[i] 
    } 

    writeMessageToSocket(availableClientSocket.socket, socketReq.fromHttpReq(req)) 
    readMessageFromSocket(availableClientSocket.socket, socketRes) 

    res.write(socketRes) 

    workingSockets.splice(workingSockets.indexOf(availableSocket.id), 1) 
} 

router.post('/rename-file', function(req, res) { 
    // ... 
} 

Теперь вам нужно переписать код немного: Ваш clientSockets теперь массив, содержащий JSON объектов:

var object = { 
    id: '123', // You need a unique ID for every socket. It's very important that there 
       // exists exactly one socket with that ID. Otherwise, the code breaks. 
    socket: new net.Socket(...) 
} 
+0

Я понимаю, что я могу вручную сделать логику, но я спрашиваю об официальном, надежном решении. –

+0

Вы можете попробовать использовать событие 'end' в сокете. https://nodejs.org/api/net.html#net_class_net_socket – Benni

Смежные вопросы