Add java client
This commit is contained in:
parent
9fef73f9c2
commit
163d778e68
13
java/README.MD
Normal file
13
java/README.MD
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# WeChatFerry Java 客户端
|
||||||
|
## 配置环境
|
||||||
|
选择 32 位的 JDK [temurin](https://adoptium.net/zh-CN/temurin/releases)。
|
||||||
|
|
||||||
|
## 重新生成 gRPC 文件
|
||||||
|
[gRPC 文件生成工具](https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-java/)。
|
||||||
|
```sh
|
||||||
|
cd java/src/main/java/
|
||||||
|
protoc --java_out=. -I=../../../../proto wcf.proto
|
||||||
|
protoc --grpc-java_out=. --plugin=protoc-gen-grpc-java="C:/Tools/bin/protoc-gen-grpc-java-1.49.2-windows-x86_32.exe" -I=../../../../proto wcf.proto
|
||||||
|
```
|
||||||
|
|
||||||
|
`C:/Tools/bin` 为工具存放路径。
|
77
java/pom.xml
Normal file
77
java/pom.xml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.iamteer.demo</groupId>
|
||||||
|
<artifactId>gRpcDemo</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<build>
|
||||||
|
<extensions>
|
||||||
|
<extension>
|
||||||
|
<groupId>kr.motd.maven</groupId>
|
||||||
|
<artifactId>os-maven-plugin</artifactId>
|
||||||
|
<version>1.6.2</version>
|
||||||
|
</extension>
|
||||||
|
</extensions>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>17</source>
|
||||||
|
<target>17</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.xolstice.maven.plugins</groupId>
|
||||||
|
<artifactId>protobuf-maven-plugin</artifactId>
|
||||||
|
<version>0.6.1</version>
|
||||||
|
<configuration>
|
||||||
|
<protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
|
||||||
|
<pluginId>grpc-java</pluginId>
|
||||||
|
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.50.0:exe:${os.detected.classifier}</pluginArtifact>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
<goal>compile-custom</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.java.dev.jna</groupId>
|
||||||
|
<artifactId>jna</artifactId>
|
||||||
|
<version>5.3.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-netty-shaded</artifactId>
|
||||||
|
<version>1.50.0</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-protobuf</artifactId>
|
||||||
|
<version>1.50.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-stub</artifactId>
|
||||||
|
<version>1.50.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency> <!-- necessary for Java 9+ -->
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>annotations-api</artifactId>
|
||||||
|
<version>6.0.53</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
144
java/src/main/java/com/iamteer/wcf/Client.java
Normal file
144
java/src/main/java/com/iamteer/wcf/Client.java
Normal file
@ -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;
|
||||||
|
}
|
64
java/src/main/java/com/iamteer/wcf/Main.java
Normal file
64
java/src/main/java/com/iamteer/wcf/Main.java
Normal file
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
package wcf;
|
package wcf;
|
||||||
|
option java_package = "com.iamteer.wcf";
|
||||||
|
|
||||||
service Wcf {
|
service Wcf {
|
||||||
rpc RpcIsLogin(Empty) returns (Response) {}
|
rpc RpcIsLogin(Empty) returns (Response) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user