2015-05-15 4 views
9

У меня возникли проблемы с подключением моего приложения Java к моему серверу SignalR.
сервер очень прост и его можно найти здесь:.
https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847bSignalR java не может подключиться к серверу

Я могу подключить веб-клиентов (JavaScript) и окна клиентов (C#), но у меня возникают проблемы с моим Java клиента (https://github.com/SignalR/java-client)

Вот мой код до сих пор:

package javaapplication2; 

import java.io.IOException; 
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.TimeoutException; 
import microsoft.aspnet.signalr.client.SignalRFuture; 
import microsoft.aspnet.signalr.client.hubs.HubConnection; 
import microsoft.aspnet.signalr.client.hubs.HubProxy; 

public class JavaApplication2 { 
     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException, TimeoutException 
     { 
      String ServerURI = "http://localhost:8080/signalr"; 
      HubConnection Connection = new HubConnection(ServerURI); 
      HubProxy HubProxy = Connection.createHubProxy("MyHub"); 
      HubProxy.on("AddMessage",() -> { System.out.println("Some message");  }); 

      Connection.error(new ErrorCallback() { 
       @Override 
       public void onError(Throwable error) { 
        error.printStackTrace(); //<==SocketException 
       } 
      }); 

      SignalRFuture<Void> con =Connection.start(); 
      con.get(); 
     } 
} 

Update

Когда я запускаю его я получаю «ExecutionException: java.net.SocketException: Подключение сброса»

Exception in thread "main" java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset 
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java:112) 
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java:102) 
at javaapplication2.JavaApplication2.main(JavaApplication2.java:27) 
Caused by: java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:209) 
at java.net.SocketInputStream.read(SocketInputStream.java:141) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:345) 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704) 
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) 
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:675) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1535) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 
at microsoft.aspnet.signalr.client.http.java.NetworkRunnable.run(NetworkRunnable.java:72) 
at java.lang.Thread.run(Thread.java:745) 

-Если я изменить «локальный» к чему-то, что не существует (например, locahostX) я получаю Java .net.UnknownHostException

-Если Если изменение «локальный» на мой IP я не событие получаю исключение ...

-Все другие приложения работают с обоими (локальный или IP)

Сначала я подумал, что это проблема с брандмауэром, но это было не так ...

Очевидно, что мне что-то не хватает ... Любые идеи?

Благодаря

ответ

3

Оказывается, что я должен был использовать перегрузку начала, тот, который принимает в качестве параметра объект ClientTransport

public SignalRFuture<Void> start(ClientTransport transport) 

Если кто-нибудь имеет объяснение, почему метод запуска без параметров не удается, пожалуйста, напишите это как ответ, и я буду отмечать его как решение.

Вот полный пример, который работает:

package javaapplication2; 

import java.io.IOException; 
import java.util.Scanner; 
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.TimeoutException; 
import microsoft.aspnet.signalr.client.SignalRFuture; 
import microsoft.aspnet.signalr.client.hubs.HubConnection; 
import microsoft.aspnet.signalr.client.hubs.HubProxy; 
import microsoft.aspnet.signalr.client.transport.ServerSentEventsTransport; 
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler2; 

public class JavaApplication2 { 
    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException, TimeoutException 
    { 
     String ServerURI = "http://localhost:8080/signalr"; 
     HubConnection Connection = new HubConnection(ServerURI); 
     HubProxy HubProxy = Connection.createHubProxy("MyHub"); 

     HubProxy.on("AddMessage", new SubscriptionHandler2<String, String>() { 
      @Override 
      public void run(String e1, String e2) { 
      System.out.println(e1.toString()+ " -> " +e2.toString()); 
      } 
     }, String.class, String.class); 

     SignalRFuture<Void> con =Connection.start(new ServerSentEventsTransport(Connection.getLogger())); //Or LongPollingTransport 

     con.get(); 

     Scanner inputReader = new Scanner(System.in); 
     String line = inputReader.nextLine(); 
     while (!"exit".equals(line)) { 
       HubProxy.invoke("send", "Console", line); 
       line = inputReader.next(); 
     } 

     inputReader.close(); 

     Connection.stop(); 
    } 
} 
+0

Не уверен, о проблеме, но вы пытались использовать перегрузку конструктора HubConnection, которая принимает экземпляр ILogger?Кажется, что автоматический выбор транспорта (переговоры) не работает, и здесь может быть полезен внутренний журнал SignalR. Попробуйте и опубликуйте журнал ... –

0

Если я изменить "локальный" к чему-то, что не существует (например locahostX) Я получаю java.net.UnknownHostException

Вы уверены, что об этом?

  1. В командной строке сервера запустите «ipconfig», чтобы получить IP-адрес сервера.
  2. В командной строке клиента введите «ping» + IP-адрес сервера.
  3. Если ping отправляет пакеты, попробуйте поместить IP-адрес в строку «ServerURI» как нечто вроде «http: //» + ServerIP + »: 8080/signalr».
+0

Спасибо Христо, но я уже попробовал IP.At сначала я думал, что это был вопрос брандмауэра, но это не было, что либо ... –

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