Серверы Dart отказываются подключаться к локальной сети

У меня Dart работает на Mac Mavericks и Ubuntu Linux. Я только начинаю, и ни один из примеров не будет работать через мою локальную сеть. Когда я устанавливаю сервер на Ubuntu и пытаюсь получить доступ с Mac, ничего не происходит. Когда я пытаюсь получить доступ из Ubunutu, я получаю сообщение об ошибке «java.net Connection Refused». То же самое касается Curl на любом компьютере (соединение отклонено). Все образцы отлично работают как клиент / сервер с локального хоста. Ни клиентские приложения, ни браузеры не могут подключиться. Все остальные серверы / клиенты нормально работают в домашней сети. Брандмауэр в порядке, и я дважды проверил номера портов. На нужных портах нет конфликтующих серверов. Я пробовал около 5 разных скриптов с сайта Dart и других, каждый из которых имеет функцию CORS, но ничего не подключается, включая пример ниже, SimpleServer -Github

Образец кода

/* A simple web server that responds to **ALL** GET requests by returning
 * the contents of data.json file, and responds to ALL **POST** requests
 * by overwriting the contents of the data.json file
 * 
 * Browse to it using http://localhost:8080  
 * 
 * Provides CORS headers, so can be accessed from any other page
 */
 import 'dart:io';

final HOST = "127.0.0.1"; // eg: localhost 
final PORT = 8080; 
final DATA_FILE = "data.json";

void main() {
  HttpServer.bind(HOST, PORT).then((server) {
     server.listen((HttpRequest request) {
      switch (request.method) {
        case "GET": 
          handleGet(request);
          break;
        case "POST": 
          handlePost(request);
          break;
        case "OPTIONS": 
          handleOptions(request);
          break;
        default: defaultHandler(request);
      }
    }, 
    onError: printError);

    print("Listening for GET and POST on http://$HOST:$PORT");
  },
  onError: printError);
}

/**
 * Handle GET requests by reading the contents of data.json
 * and returning it to the client
 */
void handleGet(HttpRequest req) {
  HttpResponse res = req.response;
  print("${req.method}: ${req.uri.path}");
  addCorsHeaders(res);

  var file = new File(DATA_FILE);
  if (file.existsSync()) {
    res.headers.add(HttpHeaders.CONTENT_TYPE, "application/json");
    file.readAsBytes().asStream().pipe(res); // automatically close output stream
  }
  else {
    var err = "Could not find file: $DATA_FILE";
    res.write(err);
    res.close();  
  }

}

/**
 * Handle POST requests by overwriting the contents of data.json
 * Return the same set of data back to the client.
 */
void handlePost(HttpRequest req) {
  HttpResponse res = req.response;
  print("${req.method}: ${req.uri.path}");

  addCorsHeaders(res);

  req.listen((List<int> buffer) {
    var file = new File(DATA_FILE);
    var ioSink = file.openWrite(); // save the data to the file
    ioSink.add(buffer);
    ioSink.close();

    // return the same results back to the client
    res.add(buffer);
    res.close();
  },
  onError: printError);
}

/**
 * Add Cross-site headers to enable accessing this server from pages
 * not served by this server
 * 
 * See: http://www.html5rocks.com/en/tutorials/cors/ 
 * and http://enable-cors.org/server.html
 */
void addCorsHeaders(HttpResponse res) {
  res.headers.add("Access-Control-Allow-Origin", "*");
  res.headers.add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
  res.headers.add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type,     Accept");
 }

void handleOptions(HttpRequest req) {
  HttpResponse res = req.response;
  addCorsHeaders(res);
  print("${req.method}: ${req.uri.path}");
  res.statusCode = HttpStatus.NO_CONTENT;
res.close();
}

void defaultHandler(HttpRequest req) {
  HttpResponse res = req.response;
  addCorsHeaders(res);
  res.statusCode = HttpStatus.NOT_FOUND;
  res.write("Not found: ${req.method}, ${req.uri.path}");
  res.close();
}

void printError(error) => print(error);

data.json

{
  "language":"DART",
  "targets":["dartium","javascript","Android?"],
  "website":{
   "homepage":"www.dartlang.org",
   "api":"api.dartlang.org"
  }

}


person Community    schedule 16.05.2014    source источник


Ответы (1)


Я думаю, это потому, что сервер Dart настроен на прослушивание только клиентов на локальном хосте. Вам нужно заставить его слушать любого клиента IPv4 / v6, чтобы получать любой ответ от сервера по сети.

Измените строку final HOST = "127.0.0.1"; на final HOST = InternetAddress.ANY_IP_V4; или final HOST = InternetAddress.ANY_IP_V6;

Это должно заставить его работать.

person Rahul De    schedule 16.05.2014
comment
Спасибо большое. Работает как шарм! - person ; 16.05.2014