Commit 05829b3f authored by sheteng's avatar sheteng

加入心跳

parent 30b8eb2b
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="10.4.6.88:5555" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2021-11-13T05:39:00.572615Z" />
</component>
</project>
\ No newline at end of file
......@@ -34,17 +34,19 @@ android {
dependencies {
def multidex_version = "2.0.1"
implementation "androidx.multidex:multidex:$multidex_version"
def lifecycle_version = "2.3.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
implementation project(path: ':ccim')
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
compile 'com.google.protobuf:protobuf-java:3.5.1'
implementation 'com.google.protobuf:protobuf-java:3.8.0'
implementation 'com.google.protobuf:protobuf-java-util:3.8.0'
implementation 'com.google.protobuf:protobuf-java:3.13.0'
implementation 'com.google.protobuf:protobuf-java:3.13.0'
implementation 'com.google.protobuf:protobuf-java-util:3.12.0'
implementation 'com.guolindev.permissionx:permissionx:1.6.1'
}
\ No newline at end of file
......@@ -107,7 +107,7 @@ public class FirstFragment extends Fragment {
binding.searchUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CCIMClient.getInstance().searchUser("feng", new ResultEventCallback<List<Chat.SearchResponse.User>>() {
CCIMClient.getInstance().searchUser(binding.userName.getText().toString(), new ResultEventCallback<List<Chat.SearchResponse.User>>() {
@Override
public void onSuccess(List<Chat.SearchResponse.User> users) {
Log.d(TAG, "onSuccess: " + users);
......
......@@ -24,7 +24,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="userId"
android:text="103" />
android:text="101" />
<EditText
android:id="@+id/userName"
......
......@@ -7,6 +7,7 @@ import com.ccwangluo.ccim.modle.IrequestData;
import com.ccwangluo.ccim.modle.MyIReaderProtocol;
import com.ccwangluo.ccim.listener.MessageListener;
import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.PulseData;
import com.ccwangluo.ccim.util.HmacUtil;
import com.xuhao.didi.core.pojo.OriginalData;
import com.xuhao.didi.socket.client.sdk.OkSocket;
......@@ -24,9 +25,9 @@ import ccim.protocol.Push;
public class SocketManageer {
private final Logger logger = Logger.getLogger(CCIMClient.class.getName());
private static final String SERVER_IP = "117.144.156.2";
// private static final String SERVER_IP = "192.168.31.216";
private static final int SERVER_PORT = 8000;
// private static final String SERVER_IP = "117.144.156.2";
private static final String SERVER_IP = "10.4.5.134";
private static final int SERVER_PORT = 8001;
private static final int version = 1;
......@@ -64,6 +65,9 @@ public class SocketManageer {
@Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
onConnectListener.onSocketConnection();
Chat.ConnectResponse connectRes = chatResponseMessage.getConnectRes();
long l = connectRes.getHeartBeatInterval() * 1000L;
pulseData(l);
}
});
}
......@@ -77,9 +81,8 @@ public class SocketManageer {
this.chatInfo = initServer(SERVER_IP, SERVER_PORT, new MessageListener() {
@Override
public void onServerConnect() {
// if(id == 1) {
if (id == 1)
connectChatServer(appKey, userName,extData, userId, ts, sign);
// }
}
@Override
......@@ -87,6 +90,14 @@ public class SocketManageer {
try {
Chat.ChatResponseMessage chatResponseMessage = Chat.ChatResponseMessage.parseFrom(data.getBodyBytes());
logger.info(chatResponseMessage.toString());
if (chatResponseMessage.hasHeartbeatRes()){
OkSocket.open(chatInfo).getPulseManager().feed();
return;
}
if (chatResponseMessage.hasConnectionStateRes()){
connectState();
return;
}
int seq = chatResponseMessage.getHeader().getSeq();
ResultEventCallback<Chat.ChatResponseMessage> callBack = callBackManager.getCallBack(seq);
if (callBack != null) {
......@@ -110,6 +121,29 @@ public class SocketManageer {
});
}
/**
* 反馈连接状态给服务器
*/
private void connectState(){
Chat.ConnectionStateAckRequest defaultInstance = Chat.ConnectionStateAckRequest.getDefaultInstance();
sendRequest(defaultInstance);
}
/**
* 心跳
*/
private void pulseData(Long frequency){
OkSocketOptions.Builder okOptionsBuilder = new OkSocketOptions.Builder();
okOptionsBuilder.setPulseFrequency(frequency);
okOptionsBuilder.setReaderProtocol(new MyIReaderProtocol());
OkSocket.open(getChatInfo()).option(okOptionsBuilder.build());
Chat.ChatRequestMessage.Builder builder = Chat.ChatRequestMessage.newBuilder();
builder.setHeartbeatReq(Chat.HeartbeatRequest.getDefaultInstance());
OkSocket.open(getChatInfo()).getPulseManager()
.setPulseSendable(new PulseData(builder.build().toByteArray()))//只需要设置一次,下一次可以直接调用pulse()
.pulse();
}
private ConnectionInfo initServer(String ip, int port, MessageListener messageListener) {
ConnectionInfo authInfo = new ConnectionInfo(ip, port);
//调用OkSocket,开启这次连接的通道,拿到通道Manager
......@@ -189,6 +223,8 @@ public class SocketManageer {
builder.setRemoveMemberReq((Channel.RemoveMemberRequest) request);
} else if (request instanceof Channel.ExitChannelRequest){
builder.setExitChannelReq((Channel.ExitChannelRequest) request);
} else if (request instanceof Chat.ConnectionStateAckRequest){
builder.setConnectionStateAckReq((Chat.ConnectionStateAckRequest) request);
}
OkSocket.open(getChatInfo())
......
package com.ccwangluo.ccim.modle;
import com.xuhao.didi.core.iocore.interfaces.IPulseSendable;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class PulseData implements IPulseSendable {
private final byte[] body;
public PulseData(byte[] body){
this.body = body;
}
@Override
public byte[] parse() {
ByteBuffer bb = ByteBuffer.allocate(4 + body.length);
bb.order(ByteOrder.BIG_ENDIAN);
bb.putInt(body.length);
bb.put(body);
return bb.array();
}
}
......@@ -8,63 +8,69 @@ import "message.proto";
import "push.proto";
message ChatRequestMessage {
RequestMessageHeader header = 1;
oneof payload {
ConnectRequest connect_req = 2; // 连接
PullContactsRequest pull_contacts_req = 3; // 拉联系人
SearchRequest search_req = 4; // 查找用户
AddContactRequest add_contact_req = 5; // 添加联系人
ContactRequestsRequest contact_requests_req = 6; // 联系人申请列表
CheckContactReqRequest check_contact_req_req = 7; // 验证联系人申请
CreateContactGroupRequest create_contact_group_req = 8; // 创建联系人群组
MoveContactGroupRequest move_contact_group_req = 9; // 移动联系人所在群组
DeleteContactRequest delete_contact_req = 10; // 删除联系人
BlockContactRequest block_contact_req = 11; // 联系人拉入黑名单
ReportIllegalUserRequest report_illegal_user_req = 12; // 举报违规用户
PullOfflineMessageRequest pull_offline_msg_req = 13; // 拉取离线消息
CreateChannelRequest create_channel_req = 21; // 创建频道
JoinChannelRequest join_channel_req = 22; // 加入频道
RemoveMemberRequest remove_member_req = 23; // 移除成员
ExitChannelRequest exit_channel_req = 24; // 退出频道
SendMessageRequest send_msg_req = 42; // 发送消息
SendChannelMessageRequest send_channel_msg_req = 43; // 发送频道消息
PushPrivateMessageAckRequest push_private_msg_ack_req = 61; // 推送私人消息成功ack
PushChannelMessageAckRequest push_channel_msg_ack_req = 62; // 推送频道消息ack
}
RequestMessageHeader header = 1;
oneof payload {
ConnectRequest connect_req = 2; // 连接
PullContactsRequest pull_contacts_req = 3; // 拉联系人
SearchRequest search_req = 4; // 查找用户
AddContactRequest add_contact_req = 5; // 添加联系人
ContactRequestsRequest contact_requests_req = 6; // 联系人申请列表
CheckContactReqRequest check_contact_req_req = 7; // 验证联系人申请
CreateContactGroupRequest create_contact_group_req = 8; // 创建联系人群组
MoveContactGroupRequest move_contact_group_req = 9; // 移动联系人所在群组
DeleteContactRequest delete_contact_req = 10; // 删除联系人
BlockContactRequest block_contact_req = 11; // 联系人拉入黑名单
ReportIllegalUserRequest report_illegal_user_req = 12; // 举报违规用户
PullOfflineMessageRequest pull_offline_msg_req = 13; // 拉取离线消息
CreateChannelRequest create_channel_req = 21; // 创建频道
JoinChannelRequest join_channel_req = 22; // 加入频道
RemoveMemberRequest remove_member_req = 23; // 移除成员
ExitChannelRequest exit_channel_req = 24; // 退出频道
SendMessageRequest send_msg_req = 42; // 发送消息
SendChannelMessageRequest send_channel_msg_req = 43; // 发送频道消息
PushPrivateMessageAckRequest push_private_msg_ack_req = 61; // 推送私人消息成功ack
PushChannelMessageAckRequest push_channel_msg_ack_req = 62; // 推送频道消息ack
HeartbeatRequest heartbeat_req = 100;
ConnectionStateAckRequest connection_state_ack_req = 101;
}
};
message ChatResponseMessage {
ResponseMessageHeader header = 1;
oneof payload {
ConnectResponse connect_res = 2;
PullContactsResponse pull_contacts_res = 3;
SearchResponse search_res = 4;
AddContactResponse add_contact_res = 5;
ContactRequestsResponse contact_requests_res = 6;
CheckContactReqResponse check_contact_req_res = 7;
CreateContactGroupResponse create_contact_group_res = 8;
MoveContactGroupResponse move_contact_group_res = 9;
DeleteContactResponse delete_contact_res = 10;
BlockContactResponse block_contact_res = 11;
PullOfflineMessageResponse pull_offline_msg_res = 12;
CreateChannelResponse create_channel_res = 21;
JoinChannelResponse join_channel_res = 22;
RemoveMemberResponse remove_member_res = 23;
ExitChannelResponse exit_channel_res = 24;
ReportIllegalUserResponse report_illegal_user_res = 41;
SendMessageResponse send_msg_res = 42;
SendChannelMessageResponse send_channel_msg_res = 43;
PushPrivateMessageResponse push_private_msg_res = 61;
PushChannelMessageResponse push_channel_msg_res = 62;
}
ResponseMessageHeader header = 1;
oneof payload {
ConnectResponse connect_res = 2;
PullContactsResponse pull_contacts_res = 3;
SearchResponse search_res = 4;
AddContactResponse add_contact_res = 5;
ContactRequestsResponse contact_requests_res = 6;
CheckContactReqResponse check_contact_req_res = 7;
CreateContactGroupResponse create_contact_group_res = 8;
MoveContactGroupResponse move_contact_group_res = 9;
DeleteContactResponse delete_contact_res = 10;
BlockContactResponse block_contact_res = 11;
PullOfflineMessageResponse pull_offline_msg_res = 12;
CreateChannelResponse create_channel_res = 21;
JoinChannelResponse join_channel_res = 22;
RemoveMemberResponse remove_member_res = 23;
ExitChannelResponse exit_channel_res = 24;
ReportIllegalUserResponse report_illegal_user_res = 41;
SendMessageResponse send_msg_res = 42;
SendChannelMessageResponse send_channel_msg_res = 43;
PushPrivateMessageResponse push_private_msg_res = 61;
PushChannelMessageResponse push_channel_msg_res = 62;
HeartbeatResponse heartbeat_res = 100;
ConnectionStateResponse connection_state_res = 101;
}
};
message ConnectRequest {
......@@ -79,9 +85,9 @@ message ConnectRequest {
// ts=CurrentTimeMillis (毫秒)
}
message ConnectResponse {
bool connected = 1; //是否连接成功
bool connected = 1; //是否连接成功
int32 heart_beat_interval = 2;
}
message PullContactsRequest {}
......@@ -126,85 +132,95 @@ message PullContactsResponse {
}
message SearchRequest {
string username = 1;
string username = 1;
}
message SearchResponse {
message User {
int64 user_id = 1;
string username = 2;
}
repeated User users = 1;
message User {
int64 user_id = 1;
string username = 2;
}
repeated User users = 1;
}
message AddContactRequest {
int64 user_id = 1;
int64 user_id = 1;
}
message AddContactResponse {
enum AddResult {
SUCCESS = 0;
ALREADY_SENT = 1;
NO_AUTHORITY = 2;
ALREADY_CONTACT = 3;
ACCEPT_REQ = 4; // 接受对方的好友申请(对方已经发送申请,自己不必申请直接同意)
}
AddResult result = 1;
enum AddResult {
SUCCESS = 0;
ALREADY_SENT = 1;
NO_AUTHORITY = 2;
ALREADY_CONTACT = 3;
ACCEPT_REQ = 4; // 接受对方的好友申请(对方已经发送申请,自己不必申请直接同意)
}
AddResult result = 1;
}
message ContactRequestsRequest {}
message ContactRequestsResponse {
message ContactRequest {
int64 user_id = 1;
string username = 2;
}
repeated ContactRequest requests = 1;
message ContactRequest {
int64 user_id = 1;
string username = 2;
}
repeated ContactRequest requests = 1;
}
message CheckContactReqRequest {
bool accept = 1;
int64 req_user_id = 2;
bool accept = 1;
int64 req_user_id = 2;
}
message CheckContactReqResponse {}
message CreateContactGroupRequest {
string name = 1;
string name = 1;
}
message CreateContactGroupResponse {
int64 group_id = 1;
int64 group_id = 1;
}
message MoveContactGroupRequest {
int64 contact_user_id = 1;
int64 contact_group_id = 2;
int64 contact_user_id = 1;
int64 contact_group_id = 2;
}
message MoveContactGroupResponse {
}
message DeleteContactRequest {
int64 contact_user_id = 1;
int64 contact_user_id = 1;
}
message DeleteContactResponse {
}
message BlockContactRequest {
int64 contact_user_id = 1;
bool mute = 2;
int64 contact_user_id = 1;
bool mute = 2;
}
message BlockContactResponse {
}
message ReportIllegalUserRequest {
int64 illegal_user_id = 1;
string title = 2;
string content = 3;
int64 illegal_user_id = 1;
string title = 2;
string content = 3;
}
message ReportIllegalUserResponse {}
message HeartbeatRequest {
}
message HeartbeatResponse {
}
message ConnectionStateAckRequest {}
message ConnectionStateResponse {
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment