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 { ...@@ -34,17 +34,19 @@ android {
dependencies { dependencies {
def multidex_version = "2.0.1" def multidex_version = "2.0.1"
implementation "androidx.multidex:multidex:$multidex_version" 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 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0' implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.navigation:navigation-fragment:2.3.0' implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0' implementation 'androidx.navigation:navigation-ui:2.3.0'
implementation project(path: ':ccim') implementation project(path: ':ccim')
testImplementation 'junit:junit:4.+' implementation 'com.google.protobuf:protobuf-java:3.13.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2' implementation 'com.google.protobuf:protobuf-java:3.13.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.google.protobuf:protobuf-java-util:3.12.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.guolindev.permissionx:permissionx:1.6.1' implementation 'com.guolindev.permissionx:permissionx:1.6.1'
} }
\ No newline at end of file
...@@ -107,7 +107,7 @@ public class FirstFragment extends Fragment { ...@@ -107,7 +107,7 @@ public class FirstFragment extends Fragment {
binding.searchUser.setOnClickListener(new View.OnClickListener() { binding.searchUser.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { 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 @Override
public void onSuccess(List<Chat.SearchResponse.User> users) { public void onSuccess(List<Chat.SearchResponse.User> users) {
Log.d(TAG, "onSuccess: " + users); Log.d(TAG, "onSuccess: " + users);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="userId" android:hint="userId"
android:text="103" /> android:text="101" />
<EditText <EditText
android:id="@+id/userName" android:id="@+id/userName"
......
...@@ -7,6 +7,7 @@ import com.ccwangluo.ccim.modle.IrequestData; ...@@ -7,6 +7,7 @@ import com.ccwangluo.ccim.modle.IrequestData;
import com.ccwangluo.ccim.modle.MyIReaderProtocol; import com.ccwangluo.ccim.modle.MyIReaderProtocol;
import com.ccwangluo.ccim.listener.MessageListener; import com.ccwangluo.ccim.listener.MessageListener;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.PulseData;
import com.ccwangluo.ccim.util.HmacUtil; import com.ccwangluo.ccim.util.HmacUtil;
import com.xuhao.didi.core.pojo.OriginalData; import com.xuhao.didi.core.pojo.OriginalData;
import com.xuhao.didi.socket.client.sdk.OkSocket; import com.xuhao.didi.socket.client.sdk.OkSocket;
...@@ -24,9 +25,9 @@ import ccim.protocol.Push; ...@@ -24,9 +25,9 @@ import ccim.protocol.Push;
public class SocketManageer { public class SocketManageer {
private final Logger logger = Logger.getLogger(CCIMClient.class.getName()); 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 = "117.144.156.2";
// private static final String SERVER_IP = "192.168.31.216"; private static final String SERVER_IP = "10.4.5.134";
private static final int SERVER_PORT = 8000; private static final int SERVER_PORT = 8001;
private static final int version = 1; private static final int version = 1;
...@@ -64,6 +65,9 @@ public class SocketManageer { ...@@ -64,6 +65,9 @@ public class SocketManageer {
@Override @Override
public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) { public void onSuccess(Chat.ChatResponseMessage chatResponseMessage) {
onConnectListener.onSocketConnection(); onConnectListener.onSocketConnection();
Chat.ConnectResponse connectRes = chatResponseMessage.getConnectRes();
long l = connectRes.getHeartBeatInterval() * 1000L;
pulseData(l);
} }
}); });
} }
...@@ -77,9 +81,8 @@ public class SocketManageer { ...@@ -77,9 +81,8 @@ public class SocketManageer {
this.chatInfo = initServer(SERVER_IP, SERVER_PORT, new MessageListener() { this.chatInfo = initServer(SERVER_IP, SERVER_PORT, new MessageListener() {
@Override @Override
public void onServerConnect() { public void onServerConnect() {
// if(id == 1) { if (id == 1)
connectChatServer(appKey, userName,extData, userId, ts, sign); connectChatServer(appKey, userName,extData, userId, ts, sign);
// }
} }
@Override @Override
...@@ -87,6 +90,14 @@ public class SocketManageer { ...@@ -87,6 +90,14 @@ public class SocketManageer {
try { try {
Chat.ChatResponseMessage chatResponseMessage = Chat.ChatResponseMessage.parseFrom(data.getBodyBytes()); Chat.ChatResponseMessage chatResponseMessage = Chat.ChatResponseMessage.parseFrom(data.getBodyBytes());
logger.info(chatResponseMessage.toString()); logger.info(chatResponseMessage.toString());
if (chatResponseMessage.hasHeartbeatRes()){
OkSocket.open(chatInfo).getPulseManager().feed();
return;
}
if (chatResponseMessage.hasConnectionStateRes()){
connectState();
return;
}
int seq = chatResponseMessage.getHeader().getSeq(); int seq = chatResponseMessage.getHeader().getSeq();
ResultEventCallback<Chat.ChatResponseMessage> callBack = callBackManager.getCallBack(seq); ResultEventCallback<Chat.ChatResponseMessage> callBack = callBackManager.getCallBack(seq);
if (callBack != null) { if (callBack != null) {
...@@ -110,6 +121,29 @@ public class SocketManageer { ...@@ -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) { private ConnectionInfo initServer(String ip, int port, MessageListener messageListener) {
ConnectionInfo authInfo = new ConnectionInfo(ip, port); ConnectionInfo authInfo = new ConnectionInfo(ip, port);
//调用OkSocket,开启这次连接的通道,拿到通道Manager //调用OkSocket,开启这次连接的通道,拿到通道Manager
...@@ -189,6 +223,8 @@ public class SocketManageer { ...@@ -189,6 +223,8 @@ public class SocketManageer {
builder.setRemoveMemberReq((Channel.RemoveMemberRequest) request); builder.setRemoveMemberReq((Channel.RemoveMemberRequest) request);
} else if (request instanceof Channel.ExitChannelRequest){ } else if (request instanceof Channel.ExitChannelRequest){
builder.setExitChannelReq((Channel.ExitChannelRequest) request); builder.setExitChannelReq((Channel.ExitChannelRequest) request);
} else if (request instanceof Chat.ConnectionStateAckRequest){
builder.setConnectionStateAckReq((Chat.ConnectionStateAckRequest) request);
} }
OkSocket.open(getChatInfo()) 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 { ...@@ -34,6 +34,9 @@ message ChatRequestMessage {
PushPrivateMessageAckRequest push_private_msg_ack_req = 61; // 推送私人消息成功ack PushPrivateMessageAckRequest push_private_msg_ack_req = 61; // 推送私人消息成功ack
PushChannelMessageAckRequest push_channel_msg_ack_req = 62; // 推送频道消息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 { ...@@ -64,6 +67,9 @@ message ChatResponseMessage {
PushPrivateMessageResponse push_private_msg_res = 61; PushPrivateMessageResponse push_private_msg_res = 61;
PushChannelMessageResponse push_channel_msg_res = 62; PushChannelMessageResponse push_channel_msg_res = 62;
HeartbeatResponse heartbeat_res = 100;
ConnectionStateResponse connection_state_res = 101;
} }
}; };
...@@ -79,9 +85,9 @@ message ConnectRequest { ...@@ -79,9 +85,9 @@ message ConnectRequest {
// ts=CurrentTimeMillis (毫秒) // ts=CurrentTimeMillis (毫秒)
} }
message ConnectResponse { message ConnectResponse {
bool connected = 1; //是否连接成功 bool connected = 1; //是否连接成功
int32 heart_beat_interval = 2;
} }
message PullContactsRequest {} message PullContactsRequest {}
...@@ -208,3 +214,13 @@ message ReportIllegalUserRequest { ...@@ -208,3 +214,13 @@ message ReportIllegalUserRequest {
message ReportIllegalUserResponse {} 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