一、客户端访问服务器标准过程
实际调用方法概述:
客户端通过连接指定的 webcad 服务端,成功后,发送数据( json 数据,说明见后面)给服务器端,然后等待接收数据,根据接收到的数据判断执行结果。可以在接收到结果或者等待超时后断开连接。
- 说明1:主要函数都有超时指定,可以根据网络状况设置时长,对于接收,可以设置小的时长,循环调用,以便随时可以通过使用线程安全退出此过程。
- 说明2:服务器会执行和缓存一定数量的任务,所以发送并不会总是成功,如果任务无法被服务器直接或者缓存执行,则会返回错误,因此可以通过等待定长时间后反复进行发送,直到成功,或者被取消。
- 说明3:此任务过程一旦执行完发送任务,任务不可中断管理,取消正在执行的任务应在此过程的发送被执行前处理,即当任务没有被正式执行转换前,通过关闭连接可以取消该任务。
发送的数据是 utf8 字符串,以 0 结尾,发送数据必须包含结尾 0,以便服务器判断数据结束。
用户可以自主选择同步或者异步方式工作,同步方式用户需要等待数据返回,异步方式需要自己创建线程等待返回。
参考样例代码里面的 "1.将dwg图纸转化成ocf例子(java).zip"。
import com.google.gson.JsonObject;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
public class testmain {
public static void main(String[] args) throws IOException {
// 构建网络连接
int nPort = 3181;
String host = "10.18.102.100";
Socket client = new Socket(host, nPort);
// Socket Client = new Socket("192.168.0.104", nPort);
if (!client.isConnected()) {
client.close();
System.out.println("连接失败,请检查IP或者端口是否正确,服务是否启动");
}
Writer writer = new OutputStreamWriter(client.getOutputStream());
// 获取json任务数据,并发送任务。字节流要用utf8编码并用0x0结束。
String sutf8 = new String(makeJson().getBytes(StandardCharsets.UTF_8));
writer.write(sutf8);
writer.write(0x0); // !!!写一个结束标识,一起发送给服务器。
writer.flush();
// 等待并读取服务器返回数据
int nLen;
StringBuffer strbuf = new StringBuffer();
byte[] bbuf = new byte[1024];
if ((nLen = client.getInputStream().read(bbuf)) != -1) {
byte[] btemp = new byte[nLen];
System.arraycopy(bbuf, 0, btemp, 0, nLen);
String strres = new String(btemp, StandardCharsets.UTF_8);
strbuf.append(strres);
}
System.out.println("下面是接收到的服务器返回数据");
System.out.print(strbuf);
// 结束任务
writer.close();
client.close();
}
// 此函数是个样例,根据下面内容,并根据具体要求,参照文档,生成实际的json数据。
// !!!注意生成的数据需要使用utf8格式。
public static String makeJson() {
...
}
}
二、任务数据结构及任务信息说明
发送数据使用 JSON 格式,String 数据的编码为 utf8
- 客户端发送任务请求
项目 | 类型 | 变量说明 |
---|---|---|
status | int | 任务状态 |
host | String | 要执行任务对应的应用名称,服务据此查找路径。 |
input | String | 要处理的任务的字符串,字符串可以用json分解。具体参见后面《任务请求字符串》。 |
output | String | "" |
timeout | int | 任务超时毫秒数(不同任务超时数允许不同,但和系统配置的超时数同时起作用)[可选] |
- 任务请求字符串(input)
转化OCF请求
项目 | 类型 | 变量说明 |
---|---|---|
taskClass | String | 任务类名称,必须是:MakeOcf |
path | String | 文件路径 |
name | String | 文件名称 |
ocf | String | ocf名称 |
layout | String | 需要转换的布局名称,如果是空,则使用dwg的默认布局。 |
dwg 图纸路径 = 文件空间 + "/dwg/" + path + "/" + name
OCF 文件路径 = 文件空间 + "/ocf/" + path + "/" + ocf
文件空间是 WebCADManager.exe
里面设置的文件路径,是所有文件的根目录。
// 此函数是个样例,根据下面内容,并根据具体要求,参照文档,生成实际的json数据。
// !!!注意生成的数据需要使用utf8格式。
public static String makeJson() {
/*
* 构造发送给webcad服务的json数据
* name:图纸名,不支持中文
* path: 图纸目录名称,不能写绝对路径,不支持中文。实际的图纸路径=根目录 + dwg + path值,其中 dwg 文件夹是强制存在的。
* ocf:生成的ocf文件名
* layout:布局名称,为空时会自动转换默认图纸空间,当在前端点击布局功能,切换布局时,会发送请求,里面有layout名称,后台获取后赋值给这个layout。
* utoken: 为空即可,暂时用不到
* taskclass:执行转化任务的名称
* id:int类型,任务编号,自定义即可
*/
JsonObject objectInput = new JsonObject();
objectInput.addProperty("name", "cad.dwg");
objectInput.addProperty("path", "1001");
objectInput.addProperty("ocf", "cad.ocf");
objectInput.addProperty("layout", "");
objectInput.addProperty("utoken", "");
objectInput.addProperty("taskclass", "MakeOcf");
objectInput.addProperty("id", new Integer(100123));
// 构造socket任务内容,下面为标准的输入和输出任务信息的格式。接收数据后,也用这个格式解析数据。
JsonObject object = new JsonObject();
object.addProperty("status", new Integer(0));
object.addProperty("host", "webcad"); // WebCAD:应用名,使用默认webcad即可
object.addProperty("input", objectInput.toString());
object.addProperty("ouput", "");
System.out.println("下面是发送给服务器的JSON数据");
System.out.println(object);
return object.toString();
}
- 获取缩略图请求
项目 | 类型 | 变量说明 |
---|---|---|
taskClass | String | 任务类名称,必须是:GetThumb |
path | String | 文件路径 |
name | String | 图纸的名称 |
thumb | String | 缩略图的文件名 |
width | int | 缩略图宽度,如果宽或高=0,则使用默认尺寸180*85。 |
height | int | 缩略图高度 |
缩略图和ocf文件的路径:
缩略图路径 = 文件空间 + "/ thumb /" + path + "/" + thumb
OCF 文件路径 = 文件空间 + "/ ocf /" + path + "/" + name.substr(0 , name.size() - 3) + "ocf"
// 构造转化缩略图的json参数
public static String getThumb(String path, String dwgname, String ocfname) {
// 构造转化缩略图的json参数
JsonObject objectInput = new JsonObject();
// 任务名称:参见文档
objectInput.addProperty("taskclass", "GetThumb");
// 图纸目录。如果在 WebCADManager.exe 里面设置的文件位置是 D:\cad\file,那么图纸目录应是:D:\cad\file\dwg\1001。
objectInput.addProperty("path", path);
// dwg文件名:test.dwg,文件需位于path指定的路径中
objectInput.addProperty("name", dwgname + ".dwg");
// 生成缩略图名称。依据上面path的例子,应生成到D:\cad\file\thumb\1001\test.png
objectInput.addProperty("thumb", ocfname + ".png");
// 如果宽和高=0,则使用默认值180*85
objectInput.addProperty("width", 400);
objectInput.addProperty("height", 400);
// 任务编号:自定义
objectInput.addProperty("id", 100123);
JsonObject object = new JsonObject();
// 状态号:返回执行结果的状态号
object.addProperty("status", 0);
object.addProperty("host", "WebCAD");
object.addProperty("input", objectInput.toString());
object.addProperty("output", "");
return object.toString();
}
- 服务端发送给客户端
项目 | 类型 | 变量说明 |
---|---|---|
status | int | 实际执行的返回码 |
host | String | 要执行任务对应的应用名称,服务据此查找路径。 |
input | String | 要处理的任务的字符串,字符串可以用json分解,如果服务在接收到客户输入前返回错误,则此为"" |
output | String | 返回的是一个信息字符串,可以是json字符串或者非json。 |
- 服务器发送任务输出信息格式(output)
项目 | 类型 | 变量说明 |
---|---|---|
code | String | 实际执行的返回码 |
msg | String | Host执行后返回的消息 |
rs | String | 执行结果的json数据字符串,需要客户端分解json。 |
- 常见的执行的返回码code
代码 | 标识 | 说明 |
---|---|---|
0 | 转换成功 | |
2 | RC_TASK_PROCESSOR_INPUT_ERROR | taskclass参数不正确 |
800 | RC_INTERNAL_SERVER_ERROR | 转换失败,大部分情况和图纸有关,需要具体的图纸来分析失败的原因 |
801 | RC_FUNCTION_CALL_ERROR | 输入的参数不正确 |
802 | RC_READ_CONFIG_ERROR | 配置文件不正确 |
{
"status": 1,
"host": "WebCAD",
"input": {
"path": "1001",
"name": "test.dwg",
"ocf": "test.ocf",
"layoutname": "",
"utoken": "",
"taskclass": "MakeOcf",
"id": 111
},
"output": {
"code": "0",
"msg": "OK",
"rs": {
"taskClass": "MakeOcf",
"id": 111,
"ocf": "test.ocf",
"layout": "*MODEL_SPACE"
},
"timestamp": 1599124145000
}
}
评论区