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();
}
}
......@@ -34,6 +34,9 @@ message ChatRequestMessage {
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;
}
};
......@@ -64,6 +67,9 @@ message ChatResponseMessage {
PushPrivateMessageResponse push_private_msg_res = 61;
PushChannelMessageResponse push_channel_msg_res = 62;
HeartbeatResponse heartbeat_res = 100;
ConnectionStateResponse connection_state_res = 101;
}
};
......@@ -79,9 +85,9 @@ message ConnectRequest {
// ts=CurrentTimeMillis (毫秒)
}
message ConnectResponse {
bool connected = 1; //是否连接成功
int32 heart_beat_interval = 2;
}
message PullContactsRequest {}
......@@ -208,3 +214,13 @@ message ReportIllegalUserRequest {
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