客户端到客户端的短消息
Client to client short messaging
我正在 Android 中实现两个客户端之间的小型通信。目前我正在使用 Firebase Realtime Database 来保存我的所有用户和推送令牌。
我使用 Firebase Cloud Messaging 使用代码中嵌入的 REST 将推送消息从一个发送到另一个。这不是很好的做法,因为我需要在应用程序中保存硬编码的服务器密钥。我考虑过使用 XMPP,但它对我的需要来说有点矫枉过正。
我需要用户之间进行少量交流,以便一个询问另一个用户的位置并获取 return 中的坐标。消息不需要保存在服务器上,它只是一次请求和响应。正如我之前所说,我目前正在为此使用 FCM。
你能建议更好的解决方案吗?
SOCKET 非常简单,许多大公司都在使用它。
如果在您的应用程序中有 2 种通信方式,您可以使用 Socket 客户端启用发送和接收方法。
例如:
要发送您的纬度和经度,请使用
String location = "123123,123123"
mSocket.emit("Update", location);
并在您的 OnCreate
:
代码下方接收其他用户的新位置
mSocket.on("Update", GettingUpdate);
mSocket.connect();
然后在 GettingUpdate
方法
中执行你的逻辑
private Emitter.Listener GettingUpdate= new Emitter.Listener() {
@Override
public void call(final Object.. args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String location;
try {
location= data.getString("location");
} catch (JSONException e) {
return;
}
Toast.makeText(getActivity(), message,Toast.LENGTH_LONG).show();
}
});
}
};
您可以在 documentation
找到示例
Android 项目示例:Github
现在您可以使用 firebase 实时数据库和云 firestore 数据库,无需 FCM,您也可以获得实时和离线
https://code.tutsplus.com/tutorials/how-to-create-an-android-chat-app-using-firebase--cms-27397
享受
似乎使用 Firebase 云消息传递是更可取的方法。但是,如果这对您不起作用,我们可以利用实时数据库来执行此操作,尽管它不是严格的客户端到客户端。
举个例子:假设我们有 2 个用户,UID 分别为 user1
和 user2
。可以构建数据库,以便每个用户在 /requests
和 /responses
节点下都有自己的列表:
{
"requests": {
"user1": {},
"user2": {}
},
"responses": {
"user1": {},
"user2": {}
}
}
在user2
想要请求user1
的位置的情况下,客户端将遵循以下流程:
对于 Android,这会像这样工作:
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private FirebaseAuth auth = FirebaseAuth.getInstance();
private String myUserId;
private void setup() {
if (auth.getCurrentUser() == null) { // User must be signed-in
finish();
return;
}
myUserId = auth.getCurrentUser().getUid();
DatabaseReference requestsRef = database.getReference("requests").child(myUserId);
DatabaseReference responsesRef = database.getReference("responses").child(myUserId);
requestsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
handleRequest(dataSnapshot.getKey());
dataSnapshot.getRef().removeValue(); // Delete the request once it's been handled
}
// ...
});
responsesRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String from = dataSnapshot.getKey();
String coordinates = dataSnapshot.getValue(String.class);
if (from != null && coordinates != null) handleResponse(from, coordinates);
dataSnapshot.getRef().removeValue(); // Delete the response once it's been handled
}
// ...
});
}
private void handleResponse(String from, String coordinates) {
Toast.makeText(this, String.format("User: %s is located at: %s", from, coordinates), Toast.LENGTH_SHORT).show();
}
private void handleRequest(String from) {
Toast.makeText(this, String.format("User: %s wants to know our location", from), Toast.LENGTH_SHORT).show();
sendResponse(from);
}
private void sendResponse(String to) {
String myCoordinates = "37.4220° N, 122.0841° W"; // Example, this will need implementing
database.getReference("/responses").child(to).child(myUserId).setValue(myCoordinates);
}
private void sendRequest(String to) {
database.getReference("/requests").child(to).child(myUserId).setValue(true);
}
在此示例中,两个用户的客户端将首先调用 setup()
以开始侦听请求和响应。
然后,要请求用户的坐标,请从一个客户端调用 sendRequest()
。另一个客户端将在 handleRequest()
方法中接收此请求并将其坐标发送到数据库。最后,请求客户端将在 handleResponse()
方法中收到此响应。
这可能不是您要找的东西,但对我来说这是一个有趣的练习,所以我还是想分享它。
我正在 Android 中实现两个客户端之间的小型通信。目前我正在使用 Firebase Realtime Database 来保存我的所有用户和推送令牌。
我使用 Firebase Cloud Messaging 使用代码中嵌入的 REST 将推送消息从一个发送到另一个。这不是很好的做法,因为我需要在应用程序中保存硬编码的服务器密钥。我考虑过使用 XMPP,但它对我的需要来说有点矫枉过正。
我需要用户之间进行少量交流,以便一个询问另一个用户的位置并获取 return 中的坐标。消息不需要保存在服务器上,它只是一次请求和响应。正如我之前所说,我目前正在为此使用 FCM。
你能建议更好的解决方案吗?
SOCKET 非常简单,许多大公司都在使用它。
如果在您的应用程序中有 2 种通信方式,您可以使用 Socket 客户端启用发送和接收方法。
例如: 要发送您的纬度和经度,请使用
String location = "123123,123123"
mSocket.emit("Update", location);
并在您的 OnCreate
:
mSocket.on("Update", GettingUpdate);
mSocket.connect();
然后在 GettingUpdate
方法
private Emitter.Listener GettingUpdate= new Emitter.Listener() {
@Override
public void call(final Object.. args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String location;
try {
location= data.getString("location");
} catch (JSONException e) {
return;
}
Toast.makeText(getActivity(), message,Toast.LENGTH_LONG).show();
}
});
}
};
您可以在 documentation
找到示例Android 项目示例:Github
现在您可以使用 firebase 实时数据库和云 firestore 数据库,无需 FCM,您也可以获得实时和离线
https://code.tutsplus.com/tutorials/how-to-create-an-android-chat-app-using-firebase--cms-27397
享受
似乎使用 Firebase 云消息传递是更可取的方法。但是,如果这对您不起作用,我们可以利用实时数据库来执行此操作,尽管它不是严格的客户端到客户端。
举个例子:假设我们有 2 个用户,UID 分别为 user1
和 user2
。可以构建数据库,以便每个用户在 /requests
和 /responses
节点下都有自己的列表:
{
"requests": {
"user1": {},
"user2": {}
},
"responses": {
"user1": {},
"user2": {}
}
}
在user2
想要请求user1
的位置的情况下,客户端将遵循以下流程:
对于 Android,这会像这样工作:
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private FirebaseAuth auth = FirebaseAuth.getInstance();
private String myUserId;
private void setup() {
if (auth.getCurrentUser() == null) { // User must be signed-in
finish();
return;
}
myUserId = auth.getCurrentUser().getUid();
DatabaseReference requestsRef = database.getReference("requests").child(myUserId);
DatabaseReference responsesRef = database.getReference("responses").child(myUserId);
requestsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
handleRequest(dataSnapshot.getKey());
dataSnapshot.getRef().removeValue(); // Delete the request once it's been handled
}
// ...
});
responsesRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String from = dataSnapshot.getKey();
String coordinates = dataSnapshot.getValue(String.class);
if (from != null && coordinates != null) handleResponse(from, coordinates);
dataSnapshot.getRef().removeValue(); // Delete the response once it's been handled
}
// ...
});
}
private void handleResponse(String from, String coordinates) {
Toast.makeText(this, String.format("User: %s is located at: %s", from, coordinates), Toast.LENGTH_SHORT).show();
}
private void handleRequest(String from) {
Toast.makeText(this, String.format("User: %s wants to know our location", from), Toast.LENGTH_SHORT).show();
sendResponse(from);
}
private void sendResponse(String to) {
String myCoordinates = "37.4220° N, 122.0841° W"; // Example, this will need implementing
database.getReference("/responses").child(to).child(myUserId).setValue(myCoordinates);
}
private void sendRequest(String to) {
database.getReference("/requests").child(to).child(myUserId).setValue(true);
}
在此示例中,两个用户的客户端将首先调用 setup()
以开始侦听请求和响应。
然后,要请求用户的坐标,请从一个客户端调用 sendRequest()
。另一个客户端将在 handleRequest()
方法中接收此请求并将其坐标发送到数据库。最后,请求客户端将在 handleResponse()
方法中收到此响应。
这可能不是您要找的东西,但对我来说这是一个有趣的练习,所以我还是想分享它。