android signalr 自动重连,如何在Android中使用Signalr
陪伴而非守候如果您使用的是SignalR.net Core,请使用https://github.com/Gurgen/SignalR-.net-core-android-client,否则连接时会出错。服务器端:以下是我的示例服务器端代码,您可以注意public void Send(string message)和public void SendChatMessage(string to, str
陪伴而非守候
如果您使用的是SignalR.net Core,请使用https://github.com/Gurgen/SignalR-.net-core-android-client,否则连接时会出错。服务器端:以下是我的示例服务器端代码,您可以注意public void Send(string message)和public void SendChatMessage(string to, string message)。服务器端应用程序:public void SendChatMessage(字符串至,字符串消息)Android客户端应用:mHubProxy.invoke(“ SendChatMessage”,receiverName,message);服务器端应用程序:public void Send(字符串消息)Android客户端应用:mHubProxy.invoke(“ Send”,message);namespace SignalRDemo{ public class ChatHub : Hub { private static ConcurrentDictionary FromUsers = new ConcurrentDictionary(); // private static ConcurrentDictionary ToUsers = new ConcurrentDictionary(); // private string userName = ""; public override Task OnConnected() { DoConnect(); Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Online" }); return base.OnConnected(); } public override Task OnDisconnected(bool stopCalled) { if (stopCalled) // Client explicitly closed the connection { string id = Context.ConnectionId; FromUsers.TryRemove(id, out userName); ToUsers.TryRemove(userName, out id); Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Offline" }); } else // Client timed out { // Do nothing here... // FromUsers.TryGetValue(Context.ConnectionId, out userName); // Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Offline By TimeOut"}); } return base.OnDisconnected(stopCalled); } public override Task OnReconnected() { DoConnect(); Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = "I'm Online Again" }); return base.OnReconnected(); } private void DoConnect() { userName = Context.Request.Headers["User-Name"]; if (userName == null || userName.Length == 0) { userName = Context.QueryString["User-Name"]; // for javascript clients } FromUsers.TryAdd(Context.ConnectionId, userName); String oldId; // for case: disconnected from Client ToUsers.TryRemove(userName, out oldId); ToUsers.TryAdd(userName, Context.ConnectionId); } public void Send(string message) { // Call the broadcastMessage method to update clients. string fromUser; FromUsers.TryGetValue(Context.ConnectionId, out fromUser); Clients.AllExcept(Context.ConnectionId).broadcastMessage(new ChatMessage() { UserName = fromUser, Message = message }); } public void SendChatMessage(string to, string message) { FromUsers.TryGetValue(Context.ConnectionId, out userName); string receiver_ConnectionId; ToUsers.TryGetValue(to, out receiver_ConnectionId); if (receiver_ConnectionId != null && receiver_ConnectionId.Length > 0) { Clients.Client(receiver_ConnectionId).broadcastMessage(new ChatMessage() { UserName = userName, Message = message }); } } }public class ChatMessage{ public string UserName { get; set; } public string Message { get; set; }}}客户端:如果您还没有阅读我对以下问题的回答:Android Studio中的SignalR集成然后,这是我的工作基本代码:public class SignalRService extends Service { private HubConnection mHubConnection; private HubProxy mHubProxy; private Handler mHandler; // to display Toast message private final IBinder mBinder = new LocalBinder(); // Binder given to clientspublic SignalRService() {}@Overridepublic void onCreate() { super.onCreate(); mHandler = new Handler(Looper.getMainLooper());}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { int result = super.onStartCommand(intent, flags, startId); startSignalR(); return result;}@Overridepublic void onDestroy() { mHubConnection.stop(); super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) { // Return the communication channel to the service. startSignalR(); return mBinder;}/** * Class used for the client Binder. Because we know this service always * runs in the same process as its clients, we don't need to deal with IPC. */public class LocalBinder extends Binder { public SignalRService getService() { // Return this instance of SignalRService so clients can call public methods return SignalRService.this; }}/** * method for clients (activities) */public void sendMessage(String message) { String SERVER_METHOD_SEND = "Send"; mHubProxy.invoke(SERVER_METHOD_SEND, message);} private void startSignalR() { Platform.loadPlatformComponent(new AndroidPlatformComponent()); Credentials credentials = new Credentials() { @Override public void prepareRequest(Request request) { request.addHeader("User-Name", "BNK"); } }; String serverUrl = "http://192.168.1.100"; mHubConnection = new HubConnection(serverUrl); mHubConnection.setCredentials(credentials); String SERVER_HUB_CHAT = "ChatHub"; mHubProxy = mHubConnection.createHubProxy(SERVER_HUB_CHAT); ClientTransport clientTransport = new ServerSentEventsTransport(mHubConnection.getLogger()); SignalRFuture signalRFuture = mHubConnection.start(clientTransport); try { signalRFuture.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); return; } String HELLO_MSG = "Hello from Android!"; sendMessage(HELLO_MSG); String CLIENT_METHOD_BROADAST_MESSAGE = "broadcastMessage"; mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE, new SubscriptionHandler1() { @Override public void run(final CustomMessage msg) { final String finalMsg = msg.UserName + " says " + msg.Message; // display Toast message mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), finalMsg, Toast.LENGTH_SHORT).show(); } }); } } , CustomMessage.class);}}活动:public class MainActivity extends AppCompatActivity {private final Context mContext = this;private SignalRService mService;private boolean mBound = false;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setClass(mContext, SignalRService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE);}@Overrideprotected void onStop() { // Unbind from the service if (mBound) { unbindService(mConnection); mBound = false; } super.onStop();} public void sendMessage(View view) { if (mBound) { // Call a method from the SignalRService. // However, if this call were something that might hang, then this request should // occur in a separate thread to avoid slowing down the activity performance. EditText editText = (EditText) findViewById(R.id.edit_message); if (editText != null && editText.getText().length() > 0) { String message = editText.getText().toString(); mService.sendMessage(message); } }}/** * Defines callbacks for service binding, passed to bindService() */private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to SignalRService, cast the IBinder and get SignalRService instance SignalRService.LocalBinder binder = (SignalRService.LocalBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; }};}CustomMessage类:public class CustomMessage { public String UserName; public String Message;}您还可以在此GitHub链接上查看我的示例客户端项目。调用响应的更新:我刚刚添加了新的示例方法:服务器端:public string iAmAvailable(string username, string password, string message){ return "BNK Response for testing Android INVOKE";}客户端:mHubProxy.invoke(String.class, "iAmAvailable", "username", "password", "TransMedic").done(new Action() { @Override public void run(String s) throws Exception { Log.w("SimpleSignalR", s); } }).onError(new ErrorCallback() { @Override public void onError(Throwable throwable) { Log.e("SimpleSignalR", throwable.toString()); } });
更多推荐
所有评论(0)