侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

3. WebCAD用户开发数据通讯协议说明

Ivan Zhang
2022-01-19 / 0 评论 / 0 点赞 / 723 阅读 / 5,910 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

一、客户端访问服务器标准过程

image.png

实际调用方法概述:
客户端通过连接指定的 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

  1. 客户端发送任务请求
项目类型变量说明
statusint任务状态
hostString要执行任务对应的应用名称,服务据此查找路径。
inputString要处理的任务的字符串,字符串可以用json分解。具体参见后面《任务请求字符串》。
outputString""
timeoutint任务超时毫秒数(不同任务超时数允许不同,但和系统配置的超时数同时起作用)[可选]
  1. 任务请求字符串(input)

转化OCF请求

项目类型变量说明
taskClassString任务类名称,必须是:MakeOcf
pathString文件路径
nameString文件名称
ocfStringocf名称
layoutString需要转换的布局名称,如果是空,则使用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();
}
  1. 获取缩略图请求
项目类型变量说明
taskClassString任务类名称,必须是:GetThumb
pathString文件路径
nameString图纸的名称
thumbString缩略图的文件名
widthint缩略图宽度,如果宽或高=0,则使用默认尺寸180*85。
heightint缩略图高度

缩略图和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();
}
  1. 服务端发送给客户端
项目类型变量说明
statusint实际执行的返回码
hostString要执行任务对应的应用名称,服务据此查找路径。
inputString要处理的任务的字符串,字符串可以用json分解,如果服务在接收到客户输入前返回错误,则此为""
outputString返回的是一个信息字符串,可以是json字符串或者非json。
  1. 服务器发送任务输出信息格式(output)
项目类型变量说明
codeString实际执行的返回码
msgStringHost执行后返回的消息
rsString执行结果的json数据字符串,需要客户端分解json。
  1. 常见的执行的返回码code
代码标识说明
0转换成功
2RC_TASK_PROCESSOR_INPUT_ERRORtaskclass参数不正确
800RC_INTERNAL_SERVER_ERROR转换失败,大部分情况和图纸有关,需要具体的图纸来分析失败的原因
801RC_FUNCTION_CALL_ERROR输入的参数不正确
802RC_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
    }
}
0

评论区