Add java client

This commit is contained in:
Changhua
2022-10-17 22:16:08 +08:00
parent 9fef73f9c2
commit 163d778e68
5 changed files with 299 additions and 0 deletions
@@ -0,0 +1,144 @@
package com.iamteer.wcf;
import java.util.List;
import java.util.Map;
import com.sun.jna.Library;
import com.sun.jna.Native;
import io.grpc.ManagedChannel;
import io.grpc.stub.StreamObserver;
import io.grpc.ManagedChannelBuilder;
public class Client {
private interface JnaLibrary extends Library {
JnaLibrary INSTANCE = Native.load("sdk", JnaLibrary.class);
void WxInitSDK();
void WxDestroySDK();
}
public void InitClient(String hostPort) {
JnaLibrary.INSTANCE.WxInitSDK();
this.connect(hostPort);
}
public void CleanupClient() {
this.DisableRecvMsg();
JnaLibrary.INSTANCE.WxDestroySDK();
}
private void connect(String hostPort) {
ManagedChannel managedChannel = ManagedChannelBuilder.forTarget(hostPort)
.usePlaintext()
.build();
this.wcfBlokingStub = WcfGrpc.newBlockingStub(managedChannel);
this.wcfStub = WcfGrpc.newStub(managedChannel);
}
public int IsLogin() {
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.Response response = this.wcfBlokingStub.rpcIsLogin(empty);
return response.getStatus();
}
public String GetSelfWxid() {
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.String rsp = this.wcfBlokingStub.rpcGetSelfWxid(empty);
return rsp.getStr();
}
public void EnableRecvMsg() {
if (isReceivingMsg) {
return;
}
isReceivingMsg = true;
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
this.wcfStub.rpcEnableRecvMsg(empty, new StreamObserver<WcfOuterClass.WxMsg>() {
@Override
public void onNext(WcfOuterClass.WxMsg value) {
System.out.printf("New Message:\n%s", value);
}
@Override
public void onError(Throwable t) {
System.err.println("EnableRecvMsg Error");
}
@Override
public void onCompleted() {
System.out.println("EnableRecvMsg Complete");
}
});
}
public int DisableRecvMsg() {
if (!isReceivingMsg) {
return 0;
}
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.Response response = this.wcfBlokingStub.rpcDisableRecvMsg(empty);
if (response.getStatus() == 0) {
isReceivingMsg = false;
return 0;
}
return -1;
}
public int SendText(String msg, String receiver, String aters) {
WcfOuterClass.TextMsg textMsg = WcfOuterClass.TextMsg.newBuilder().setMsg(msg).setReceiver(receiver)
.setAters(aters).build();
WcfOuterClass.Response response = this.wcfBlokingStub.rpcSendTextMsg(textMsg);
return response.getStatus();
}
public int SendImage(String path, String receiver) {
WcfOuterClass.ImageMsg imageMsg = WcfOuterClass.ImageMsg.newBuilder().setPath(path).setReceiver(receiver)
.build();
WcfOuterClass.Response response = this.wcfBlokingStub.rpcSendImageMsg(imageMsg);
return response.getStatus();
}
public Map<Integer, String> GetMsgTypes() {
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.MsgTypes msgTypes = this.wcfBlokingStub.rpcGetMsgTypes(empty);
return msgTypes.getTypesMap();
}
public List<WcfOuterClass.Contact> GetContacts() {
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.Contacts contacts = this.wcfBlokingStub.rpcGetContacts(empty);
return contacts.getContactsList();
}
public List<String> GetDbs() {
WcfOuterClass.Empty empty = WcfOuterClass.Empty.newBuilder().build();
WcfOuterClass.DbNames dbs = this.wcfBlokingStub.rpcGetDbNames(empty);
return dbs.getNamesList();
}
public List<WcfOuterClass.DbTable> GetTables(String db) {
WcfOuterClass.String str = WcfOuterClass.String.newBuilder().setStr(db).build();
WcfOuterClass.DbTables tables = this.wcfBlokingStub.rpcGetDbTables(str);
return tables.getTablesList();
}
public List<WcfOuterClass.DbRow> QuerySql(String db, String sql) {
WcfOuterClass.DbQuery query = WcfOuterClass.DbQuery.newBuilder().setDb(db).setSql(sql).build();
WcfOuterClass.DbRows rows = this.wcfBlokingStub.rpcExecDbQuery(query);
return rows.getRowsList();
}
public int AcceptNewFriend(String v3, String v4) {
WcfOuterClass.Verification v = WcfOuterClass.Verification.newBuilder().setV3(v3).setV4(v4).build();
WcfOuterClass.Response response = this.wcfBlokingStub.rpcAcceptNewFriend(v);
return response.getStatus();
}
private boolean isReceivingMsg = false;
private WcfGrpc.WcfBlockingStub wcfBlokingStub;
private WcfGrpc.WcfStub wcfStub;
}
@@ -0,0 +1,64 @@
package com.iamteer.wcf;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
public class Main {
public static void main(String[] args) throws Exception {
String hostPort = "localhost:10086";
Client client = new Client();
client.InitClient(hostPort);
System.out.println("Connecting to " + hostPort);
int status = client.IsLogin();
System.out.println(status);
String wxid = client.GetSelfWxid();
System.out.println(wxid);
client.EnableRecvMsg(); // Receive Message
Map<Integer, String> msgTypes = client.GetMsgTypes();
Iterator<Map.Entry<Integer, String>> iterTypes = msgTypes.entrySet().iterator();
while (iterTypes.hasNext()) {
Map.Entry<Integer, String> entry = iterTypes.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
List<WcfOuterClass.Contact> contacts = client.GetContacts();
Iterator<WcfOuterClass.Contact> iterContacts = contacts.iterator();
while (iterContacts.hasNext()) {
WcfOuterClass.Contact contact = iterContacts.next();
System.out.println(contact);
}
List<String> dbs = client.GetDbs();
Iterator<String> iterDbs = dbs.iterator();
while (iterDbs.hasNext()) {
String db = iterDbs.next();
System.out.println(db);
}
List<WcfOuterClass.DbTable> tables = client.GetTables("MicroMsg.db");
Iterator<WcfOuterClass.DbTable> iterTables = tables.iterator();
while (iterTables.hasNext()) {
WcfOuterClass.DbTable table = iterTables.next();
System.out.println(table);
}
List<WcfOuterClass.DbRow> rows = client.QuerySql("MicroMsg.db", "SELECT * FROM Contact LIMIT 1;");
Iterator<WcfOuterClass.DbRow> iterRows = rows.iterator();
while (iterRows.hasNext()) {
WcfOuterClass.DbRow row = iterRows.next();
System.out.println(row);
}
// status = client.AcceptNewFriend("v3", "v4"); // 需要真实的数据
// System.out.println(status);
Thread.sleep(1000);
client.CleanupClient();
}
}