2015-10-14 176 views
3

我在Android項目中使用SignalR Java Client來連接到運行在本地主機上的服務器(只是一個用C#編寫的控制檯應用程序)。以下是我在Android方面的代碼,主要活動的onCreate方法。該應用程序在模擬器上運行,因此我將URL的localhost部分更改爲「10.0.2.2」。SignalR Java客戶端 - 當啓動HubConnection時出現NegotiationException

try { 

    AndroidPlatformComponent com = new AndroidPlatformComponent(); 
    Platform.loadPlatformComponent(com); 

    String url = "http://10.0.2.2:8080/signalr"; 
    HubConnection connection = new HubConnection(url); 
    HubProxy hubProxy = connection.createHubProxy("MyHub"); 

    connection.start().get(); 

    hubProxy.on("Send", new SubscriptionHandler2<String, String>() { 
     @Override 
     public void run(String e1, String e2) { 
      Log.d("Server", e1.toString() + " -> " + e2.toString()); 
     } 
    }, String.class, String.class); 


}catch (Exception ex){ 
    ex.printStackTrace(); 
} 

而且每次我收到就行connection.start().get();以下錯誤:

10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: java.util.concurrent.ExecutionException: microsoft.aspnet.signalr.client.transport.NegotiationException: There was a problem in the negotiation with the server 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java:112) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java:102) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at com.izmyr.projectx.main.MainActivity$2.onClick(MainActivity.java:85) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.view.View.performClick(View.java:4084) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.view.View$PerformClick.run(View.java:16966) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.os.Handler.handleCallback(Handler.java:615) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.os.Looper.loop(Looper.java:137) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at java.lang.reflect.Method.invoke(Method.java:511) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: Caused by: microsoft.aspnet.signalr.client.transport.NegotiationException: There was a problem in the negotiation with the server 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.transport.HttpClientTransport$1.onResponse(HttpClientTransport.java:86) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.http.java.NetworkRunnable.run(NetworkRunnable.java:82) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at java.lang.Thread.run(Thread.java:856) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: Caused by: microsoft.aspnet.signalr.client.http.InvalidHttpStatusCodeException: Invalid status code: 400 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: Response: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: <HTML><HEAD><TITLE>Bad Request</TITLE> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: <BODY><h2>Bad Request - Invalid Hostname</h2> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: <hr><p>HTTP Error 400. The request hostname is invalid.</p> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: </BODY></HTML> 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err: Headers: [null: HTTP/1.1 400 Bad Request; ]; [Date: Wed, 14 Oct 2015 20:01:57 GMT; ]; [Content-Length: 334; ]; [X-Android-Received-Millis: 1444852816135; ]; [Connection: close; ]; [Content-Type: text/html; charset=us-ascii; ]; [Server: Microsoft-HTTPAPI/2.0; ]; [X-Android-Sent-Millis: 1444852816126; ]; 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.transport.HttpClientTransport.throwOnInvalidStatusCode(HttpClientTransport.java:206) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  at microsoft.aspnet.signalr.client.transport.HttpClientTransport$1.onResponse(HttpClientTransport.java:76) 
10-14 20:00:16.135 27165-27165/com.izmyr.projectx W/System.err:  ... 2 more 

我試圖從onCreate採取的代碼,並把它變成一個AsyncTask,但它也不能工作。

我需要儘快提供任何形式的建議/解決方案。

編輯:以下是我簡單的服務器端代碼:

using System; 
using Microsoft.AspNet.SignalR; 
using Microsoft.Owin.Hosting; 
using Owin; 
using Microsoft.Owin.Cors; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // This will *ONLY* bind to localhost, if you want to bind to all addresses 
      // use http://*:8080 to bind to all addresses. 
      // See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx 
      // for more information. 
      string url = "http://localhost:8080"; 
      using (WebApp.Start(url)) 
      { 
       Console.WriteLine("Server running on {0}", url); 

       var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
       var key = Console.ReadLine(); 
       while (key != "quit") 
       { 
        context.Clients.All.Send("Server", key); 
        key = Console.ReadLine(); 
       } 
      } 
     } 
    } 
    class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 
      app.MapSignalR(); 
     } 
    } 
    public class MyHub : Hub 
    { 
     public void Receive(string name, string message) 
     { 
      Console.WriteLine(name + " " + message); 
     } 

     public void Send(string name, string message) 
     { 
      Clients.All.addMessage(name, message); 
     } 
    } 
} 
+0

嘗試使用SubscriptionHandler1而不是SubscriptionHandler2。此外,請確保您的Hub名稱與服務器端相同。如果可能,發佈您的服務器應用程序的代碼。並閱讀我的答案在下面http://stackoverflow.com/questions/32573823/how-to-use-signalr-in-android/32574829#32574829 – BNK

+0

並嘗試使用「ClientTransport clientTransport ...」在我的鏈接上面 – BNK

+0

我添加了我的服務器端代碼。 SubscriptionHandler不會有問題,因爲我的代碼甚至無法進入該行。它始終在connection.start()。get();)處拋出異常。使用ClientTransport也沒有改變這種情況。 –

回答

-1

我通過在服務器端代碼中將string url = "http://localhost:8080";行替換爲string url = "http://*:8080";並以管理員身份運行來解決此問題。

0

從你的logcat 」 ......產生的原因:microsoft.aspnet.signalr.client.http.InvalidHttpStatusCodeException:狀態代碼無效:400 ...「」... HTTP錯誤400.請求主機名無效...「

所以先檢查你的服務器應用程序。從您的PC /筆記本電腦的網絡瀏覽器,訪問http://ip:8080/signalr(ip是您的PC的IP地址)而不是http://localhost:8080/signalr並查看結果。

然後,從您的Android客戶端,通過該IP替換10.0.2.2。

+0

結果爲「錯誤的請求 - 無效的主機名/ HTTP錯誤400.請求主機名無效。」。可能是什麼問題呢? –

+0

如果您使用IIS Express,請閱讀http://stackoverflow.com/questions/14725455/connecting-to-visual-studio-debugging-iis-express-server-over-the-lan。此外,在StackOverflow中搜索許多其他可用的主題 – BNK