2014-10-18 193 views
1

我的服务器代码以这种方式开始,我希望获取客户端IP,无论何时连接和何时断开连接。DARTlang获取客户端IP

List<WebSocket> connections; 

void main() { 
    connections = new List<WebSocket>(); 

    HttpServer.bind(HOST, PORT).then((HttpServer server) { 
     print('Server listening on port ${PORT}.'); 
     server.listen((HttpRequest request) { 
      if (WebSocketTransformer.isUpgradeRequest(request)) { 
      WebSocketTransformer.upgrade(request).then(handleWS); 
      } else gotMSG(request);   
     }); 
    }); 
} 

handleWS(WebSocket ws){ 

    connections.add(ws); 
    print('Client connected, there are now ${connections.length} client(s) connected.'); 
    ws.listen((String message) { 
     for (WebSocket connection in connections) { 
     connection.add(message); 
     } 
    }, 
    onDone:() { 
     connections.remove(ws); 
     print('Client disconnected, there are now ${connections.length} client(s) connected.'); 
    }); 
} 

任何想法?

回答

1

我看不到任何方法从WebSocket获得IP,但是您可以从HttpRequest获取IP并从那里传递;这样的事情(注:我无法运行它,所以你可能需要调整,使其工作):

// in main()... 
// Pass client IP into handleWS, which now returns the function 
webSocketTransformer.upgrade(request) 
    .then(handleWS(request.connectionInfo.remoteAddress)); 



// handleWS now takes the IP, and then returns the original function, 
// which now has clientAddress in scope. 
handleWS(InternetAddress clientAddress) { 
    return (WebSocket ws) { 
    connections.add(ws); 
    print('Client $clientAddress connected, there are now ${connections.length} client(s) connected.'); 
    ws.listen(
     (String message) { 
     for (WebSocket connection in connections) { 
      connection.add(message); 
     } 
     }, 
     onDone:() { 
     connections.remove(ws); 
     print('Client $clientAddress disconnected, there are now ${connections.length} client(s) connected.'); 
     } 
    ); 
    }; 
} 
0

这是多么我已经做到了。请注意使用.connectionInfo

HttpServer.bind(InternetAddress.ANY_IP_V4,8090).then((HttpServer server) { 
    print("HttpServer listening at ${server.address}:${server.port}..."); 
    server.serverHeader = "EventDashboard Socket server by Jan D."; 
    server.listen((HttpRequest request) { 
    if (WebSocketTransformer.isUpgradeRequest(request)) { 
     print(request.connectionInfo.remoteAddress); 
     WebSocketTransformer.upgrade(request).then(handleWebSocket); 
    } 
    else { 
     print("Regular ${request.method} request for: ${request.uri.path}"); 
     request.response.statusCode = HttpStatus.FORBIDDEN; 
     request.response.reasonPhrase = "WebSocket connections only"; 
     request.response.close(); 
    } 
    });