【问题标题】:SignalR java cannot connect to serverSignalR java无法连接到服务器
【发布时间】:2015-05-15 15:56:21
【问题描述】:

我在将 java 应用程序连接到 SignalR 服务器时遇到问题。
服务器很简单,可以在这里找到:
https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b

我可以连接 web 客户端(javascript)windows 客户端 (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(); 
       }
}

更新

当我运行它时,我得到一个“ExecutionException: java.net.SocketException: Connection reset”

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)

-如果我将“localhost”更改为不存在的内容(例如 locahostX),我会得到 java.net.UnknownHostException

-如果将“localhost”更改为我的 IP,我不会遇到异常...

-所有其他应用程序都可以同时使用(本地主机或 IP)

一开始我以为是防火墙问题,但其实不是……

显然我错过了一些东西...... 有什么想法吗?

谢谢

【问题讨论】:

  • 能说说你用过的依赖版本吗?
  • @VimukthiSineth 那是 5 年前的事了,我不记得了

标签: java signalr signalr.client


【解决方案1】:

原来我不得不使用 start 的重载,它以 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();
   }
}

【讨论】:

  • 不确定问题,但您是否尝试使用采用 ILogger 实例的 HubConnection 构造函数重载?似乎自动传输选择(协商)不起作用,内部 SignalR 日志在这里可能会有所帮助。尝试并发布日志...
【解决方案2】:

如果我将“localhost”更改为不存在的内容(例如 locahostX) 我得到一个 java.net.UnknownHostException

你确定吗?

  1. 在服务器命令提示符下运行“ipconfig”以获取服务器的 IP 地址。
  2. 从客户端命令提示符键入“ping” + 服务器的 IP 地址。
  3. 如果 ping 发送包,则尝试将 IP 放入字符串“ServerURI”中,类似于“http://”+ServerIP+“:8080/signalr”。

【讨论】:

  • 谢谢Hristo,但是我已经试过IP了。起初我以为是防火墙问题,但事实并非如此......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2011-05-28
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多