在 Android 中设置信号 R:Crash/Hung 问题
Setting up Signal R in Android: Crash/Hung Issue
我按照 THIS tutorial 为我的 Android 应用程序设置了一个 .NET 后端来实现 Signal R。我设置了一个 SignalR 自托管后端。
这是我在控制台项目中的后端代码:
namespace SignalRSelfHost
{
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);
Console.ReadLine();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MessageHub : Hub
{
public static event Action<string, string> MessageReceived = delegate { };
public void SendMessage(string name, string message)
{
MessageReceived(name, message);
}
}
public class CustomType
{
public string Name;
public int Id;
}
}
我的Android代码:
Handler handler;
TextView statusField;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
handler = new Handler();
statusField = (TextView) findViewById(R.id.statusField);
Platform.loadPlatformComponent(new AndroidPlatformComponent());
// Change to the IP address and matching port of your SignalR server.
String host = "http://192.168.1.5:8080/";
HubConnection connection = new HubConnection( host );
HubProxy hub = connection.createHubProxy( "MessageHub" );
ClientTransport transport = new ServerSentEventsTransport(connection.getLogger());
SignalRFuture<Void> awaitConnection = connection.start(transport);
try {
awaitConnection.get();
}
catch (InterruptedException e) {
Log.d("CHECK", e.toString());
e.printStackTrace();
} catch (ExecutionException e) {
Log.d("CHECK", e.toString());
e.printStackTrace();
}
hub.subscribe(this);
try {
hub.invoke( "SendMessage", "Client", "Hello world!" ).get();
hub.invoke( "SendCustomType",
new CustomType() {{ Name = "Universe"; Id = 42; }} ).get();
} catch (InterruptedException e) {
// Handle ...
} catch (ExecutionException e) {
// Handle ...
}
}
public void UpdateStatus(String status) {
final String fStatus = status;
handler.post(new Runnable() {
@Override
public void run() {
statusField.setText(fStatus);
}
});
}
public class CustomType
{
public String Name;
public int Id;
}
但是,我最终遇到了一个挂起的屏幕,它什么都不显示,而且应用程序停止响应。 android 记录器显示以下错误:
java.util.concurrent.ExecutionException: java.net.ConnectException:
failed to connect to localhost/127.0.0.1 (port 80) after 15000ms:
isConnected failed: ECONNREFUSED (Connection refused)
我的代码是否正确,我是否正确地遵循了指南?这是一个非常直接的指南,但出现了这个问题。有人可以帮忙吗?
编辑:
This 是一个非常相似的问题,实际上它描述的是同一个问题。然而,这对我没有任何好处。如果您注意到我的 android 代码,我已经在那个问题中提出了这些更改。还是没有解决问题。
堆栈跟踪
java.util.concurrent.ExecutionException: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 112)
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 102)
at com.example.dinuka.signalrtest.Main2Activity.onCreate(Main2Activity.java: 40)
at android.app.Activity.performCreate(Activity.java: 6289)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2655)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2767)
at android.app.ActivityThread.access0(ActivityThread.java: 177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1449)
at android.os.Handler.dispatchMessage(Handler.java: 102)
at android.os.Looper.loop(Looper.java: 145)
at android.app.ActivityThread.main(ActivityThread.java: 5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1195)
Caused by: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java: 169)
at libcore.io.IoBridge.connect(IoBridge.java: 122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 456)
at java.net.Socket.connect(Socket.java: 882)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java: 139)
at com.android.okhttp.Connection.connect(Connection.java: 1194)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java: 392)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java: 295)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java: 373)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java: 323)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java: 491)
at microsoft.aspnet.signalr.client.http.java.NetworkRunnable.run(NetworkRunnable.java: 72)
at java.lang.Thread.run(Thread.java: 818)
几天前我遇到了类似的问题,这个 Github 问题对我有所帮助:
https://github.com/SignalR/java-client/issues/63
基本上我所做的就是修改signalr-client-sdk项目中的WebsocketTransport.java。替换:
uri = new URI(url);
与
uri = new URI(url.replace("http://", "ws://"));
源代码第 86 行附近。
我现在可以连接并发送消息和接收原始数据,但无法订阅事件...
希望这可以帮助您解决问题。
我按照 THIS tutorial 为我的 Android 应用程序设置了一个 .NET 后端来实现 Signal R。我设置了一个 SignalR 自托管后端。
这是我在控制台项目中的后端代码:
namespace SignalRSelfHost
{
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);
Console.ReadLine();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MessageHub : Hub
{
public static event Action<string, string> MessageReceived = delegate { };
public void SendMessage(string name, string message)
{
MessageReceived(name, message);
}
}
public class CustomType
{
public string Name;
public int Id;
}
}
我的Android代码:
Handler handler;
TextView statusField;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
handler = new Handler();
statusField = (TextView) findViewById(R.id.statusField);
Platform.loadPlatformComponent(new AndroidPlatformComponent());
// Change to the IP address and matching port of your SignalR server.
String host = "http://192.168.1.5:8080/";
HubConnection connection = new HubConnection( host );
HubProxy hub = connection.createHubProxy( "MessageHub" );
ClientTransport transport = new ServerSentEventsTransport(connection.getLogger());
SignalRFuture<Void> awaitConnection = connection.start(transport);
try {
awaitConnection.get();
}
catch (InterruptedException e) {
Log.d("CHECK", e.toString());
e.printStackTrace();
} catch (ExecutionException e) {
Log.d("CHECK", e.toString());
e.printStackTrace();
}
hub.subscribe(this);
try {
hub.invoke( "SendMessage", "Client", "Hello world!" ).get();
hub.invoke( "SendCustomType",
new CustomType() {{ Name = "Universe"; Id = 42; }} ).get();
} catch (InterruptedException e) {
// Handle ...
} catch (ExecutionException e) {
// Handle ...
}
}
public void UpdateStatus(String status) {
final String fStatus = status;
handler.post(new Runnable() {
@Override
public void run() {
statusField.setText(fStatus);
}
});
}
public class CustomType
{
public String Name;
public int Id;
}
但是,我最终遇到了一个挂起的屏幕,它什么都不显示,而且应用程序停止响应。 android 记录器显示以下错误:
java.util.concurrent.ExecutionException: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 80) after 15000ms: isConnected failed: ECONNREFUSED (Connection refused)
我的代码是否正确,我是否正确地遵循了指南?这是一个非常直接的指南,但出现了这个问题。有人可以帮忙吗?
编辑:
This 是一个非常相似的问题,实际上它描述的是同一个问题。然而,这对我没有任何好处。如果您注意到我的 android 代码,我已经在那个问题中提出了这些更改。还是没有解决问题。
堆栈跟踪
java.util.concurrent.ExecutionException: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 112)
at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 102)
at com.example.dinuka.signalrtest.Main2Activity.onCreate(Main2Activity.java: 40)
at android.app.Activity.performCreate(Activity.java: 6289)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2655)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2767)
at android.app.ActivityThread.access0(ActivityThread.java: 177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1449)
at android.os.Handler.dispatchMessage(Handler.java: 102)
at android.os.Looper.loop(Looper.java: 145)
at android.app.ActivityThread.main(ActivityThread.java: 5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java: 372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1195)
Caused by: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java: 169)
at libcore.io.IoBridge.connect(IoBridge.java: 122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 456)
at java.net.Socket.connect(Socket.java: 882)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java: 139)
at com.android.okhttp.Connection.connect(Connection.java: 1194)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java: 392)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java: 295)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java: 373)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java: 323)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java: 491)
at microsoft.aspnet.signalr.client.http.java.NetworkRunnable.run(NetworkRunnable.java: 72)
at java.lang.Thread.run(Thread.java: 818)
几天前我遇到了类似的问题,这个 Github 问题对我有所帮助: https://github.com/SignalR/java-client/issues/63
基本上我所做的就是修改signalr-client-sdk项目中的WebsocketTransport.java。替换:
uri = new URI(url);
与
uri = new URI(url.replace("http://", "ws://"));
源代码第 86 行附近。
我现在可以连接并发送消息和接收原始数据,但无法订阅事件...
希望这可以帮助您解决问题。