Curl может подключаться к железному серверу на localhost, но Scala периодически не может

#scala #rust #iron

#scala #Ржавчина #железо

Вопрос:

В моем приложении Rust я запускаю Iron следующим образом:

 let host: amp;str = amp;format!("localhost:{}", port);
info!("Server running at http://{}", host);
Iron::new(Chain::new(router)).http(host).expect("Could not start Iron server");
  

Он отвечает:

 INFO Server running at http://localhost:3000
  

Я могу его свернуть:

 $ curl "http://localhost:3000/v1/foo"
{"bar":"baz"}
  

Однако в Scala я не могу подключиться:

 $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
Type in expressions for evaluation. Or try :help.

scala> scala.io.Source.fromURL("http://localhost:3000/v1/foo").mkString
java.net.ConnectException: Connection refused
  at java.net.PlainSocketImpl.socketConnect(Native Method)
  

spray-client также не может подключиться:

 spray.can.Http$ConnectionAttemptFailedException: Connection attempt to 127.0.0.1:3000 failed
  

Обе эти попытки с одного и того же IP, и localhost является правильным. Железный сервер ничего не регистрирует при сбое запроса на подключение.

Различные комбинации localhost vs 127.0.0.1 как на клиенте, так и на сервере не решают проблему. Я неправильно диагностировал это. Использование 127.0.0.1 в клиенте Rust устраняет проблему.

После перерыва код начал работать. Я не помню, перезапускал ли я Iron. Затем я провел несколько часов разработки против него. На каком-то этапе он снова перестал работать. Перезапуск JVM и / или железного сервера не помогает устранить проблему.

Это не относится к моему приложению Rust;

Я могу воссоздать проблему с помощью примера приложения hello world Iron.

 $ git clone https://github.com/iron/iron.git
$ (cd iron amp;amp; cargo run --example hello)
  

и затем

 $ curl "http://localhost:3000/"
Hello world!
  

но

 $ scala
scala> scala.io.Source.fromURL("http://localhost:3000/").mkString
java.net.ConnectException: Connection refused
  
  • OSX 10.11.6
  • cargo 0.13.0-каждую ночь (9399229 2016-09-14)
  • также проверено на cargo 0.13.0-nightly (19cfb67 2016-09-28)

Комментарии:

1. В вашем приложении Scala, если вы подключитесь к 127.0.0.1 вместо localhost, это сработает? (или аналогично, если вы запустите приложение rust на 127.0.0.1?)

2. Спасибо за предложение, Эрик. После обеда и повторного возвращения он работает. Я не знаю, что могло быть не так, но я предполагаю, что допустил простую ошибку. Удаляю этот вопрос…

3. Восстановлен этот вопрос. Это временная проблема!

4. Предположение 1: вы работаете в Windows, а брандмауэр или антивирус блокируют подключение Java к любому месту.

5. Спасибо за доработку, интересная проблема

Ответ №1:

Согласно этому комментарию к этому сообщению об ошибке, «Железо по умолчанию преобразует (‘localhost’) в IPv6, в то время как другие ваши службы используют IPv4»

Привязать железо к 127.0.0.1 , пока эта ошибка не устранена.