如果您使用的是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 clients

public SignalRService() {

}

@Override

public void onCreate() {

super.onCreate();

mHandler = new Handler(Looper.getMainLooper());

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

int result = super.onStartCommand(intent, flags, startId);

startSignalR();

return result;

}

@Override

public void onDestroy() {

mHubConnection.stop();

super.onDestroy();

}

@Override

public 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;

@Override

protected 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);

}

@Override

protected 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

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐