a375bfa661af1876cd2c2aac710d6454.png

陪伴而非守候

如果您使用的是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());            }        });

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐