JAVA与C程序交互,我这种情况下是否适合用RPC?

bandaoyu 2018-03-06 08:58:35
现在已经有C/S的server程序,server程序是C编写的,PC端和app的client都是连的C server通过TCP发消息获取数据,现在想增加B/S功能,有两种方式,第一种就是B/S的后端JAVA与C server通信获取数据,然后交给前端展示,

第二种就是不经过C server,B/S的后端JAVA直接从数据库获取数据。


第一种的优点是,C server中的业务逻辑不需要再重新实现,缺点是JAVA与C之间的通信效率如何?如何通信并不熟悉,有风险。

第二种的优点是,JAVA不需要经过第三方直接操作数据库、资源获得数据,缺点是 C server实现的业务需要JAVA再重新实现一遍,维护的时候C server和JAVA都需要维护,维护难度加大。



web的构架是apache+tomcat 也可以apache+php,那可不可以对C server 进行改造,做成RPC server,然后B/S的后端JAVA 通过RPC对以前的业务程序进行调用?


是否适合?工作量如何?
...全文
1075 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackyRao 2018-07-05
  • 打赏
  • 举报
回复
这个和通信机制有关系, 如何有数据是后端推送到前段, 方案一可能更好处理一点。
赵4老师 2018-05-11
  • 打赏
  • 举报
回复
引用 24 楼 bandaoyu 的回复:
引用 23 楼 zhao4zhong1 的回复:
知我者谓我心忧,不知我者谓我何求。
引用 23 楼 zhao4zhong1 的回复:
[quote=引用 21 楼 bandaoyu 的回复:] [quote=引用 19 楼 zhao4zhong1 的回复:] 试试不用我说的方案,让Apple ][ 8位6502汇编和Win10 64位 Python交互。
哈哈哈哈,老大,你这招太狠了
知我者谓我心忧,不知我者谓我何求。[/quote] 可是你的方法需要解决并发的问题,也就是生成的文件的名称要有唯一标识,现在我就遇到这个问题,之前servlet用进程ID,不知道有没有其他更好的办法[/quote] 百度搜“全局唯一ID的生成”
狐狸小十 2018-05-10
  • 打赏
  • 举报
回复
要么就改客户端,做网页解析,总归是要做web服务器的,一劳永逸 不过之前做过的东西貌似都没怎么用上,看你们够不够狠心了 分步来,可以先用你的第二种
bandaoyu 2018-05-10
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
知我者谓我心忧,不知我者谓我何求。
引用 23 楼 zhao4zhong1 的回复:
引用 21 楼 bandaoyu 的回复:
[quote=引用 19 楼 zhao4zhong1 的回复:] 试试不用我说的方案,让Apple ][ 8位6502汇编和Win10 64位 Python交互。
哈哈哈哈,老大,你这招太狠了
知我者谓我心忧,不知我者谓我何求。[/quote] 可是你的方法需要解决并发的问题,也就是生成的文件的名称要有唯一标识,现在我就遇到这个问题,之前servlet用进程ID,不知道有没有其他更好的办法
赵4老师 2018-04-28
  • 打赏
  • 举报
回复
引用 21 楼 bandaoyu 的回复:
引用 19 楼 zhao4zhong1 的回复:
试试不用我说的方案,让Apple ][ 8位6502汇编和Win10 64位 Python交互。
哈哈哈哈,老大,你这招太狠了
知我者谓我心忧,不知我者谓我何求。
bandaoyu 2018-04-27
  • 打赏
  • 举报
回复
引用 20 楼 housecarl 的回复:
强烈建议不要搞两个server一起操作同一个数据库,除非你们公司有很厉害的dba。否则谁试谁知道。 我们以前的公司和别的公司做数据交互的时候,有几种方式: 1.txt文本或者xml文本(做个接口) 2.做个专门的数据转换接口,一端连java一端连c
“强烈建议不要搞两个server一起操作同一个数据库”,你的意思应该是两个server独立,彼此不知道对方做什么,容易引起冲突的情况吧。 我们这边C server 和 web server都是我们自己的,所以冲突会尽量避免,我们服务器用户数量也不太多,这种情况搞两个数据库可能不太好。
bandaoyu 2018-04-27
  • 打赏
  • 举报
回复
引用 19 楼 zhao4zhong1 的回复:
试试不用我说的方案,让Apple ][ 8位6502汇编和Win10 64位 Python交互。
哈哈哈哈,老大,你这招太狠了
轻箬笠 2018-04-24
  • 打赏
  • 举报
回复
强烈建议不要搞两个server一起操作同一个数据库,除非你们公司有很厉害的dba。否则谁试谁知道。 我们以前的公司和别的公司做数据交互的时候,有几种方式: 1.txt文本或者xml文本(做个接口) 2.做个专门的数据转换接口,一端连java一端连c
赵4老师 2018-04-21
  • 打赏
  • 举报
回复
试试不用我说的方案,让Apple ][ 8位6502汇编和Win10 64位 Python交互。
bandaoyu 2018-04-21
  • 打赏
  • 举报
回复
引用 17 楼 zilaishuichina 的回复:
[quote=引用 10 楼 bandaoyu 的回复:] [quote=引用 6 楼 zilaishuichina 的回复:] 个人倾向是: ……
[/quote] 太感谢你了,从你和赵老师那里学到的最多,回答的内容非常有含金量,很有用,非常感谢。
zilaishuichina 2018-04-16
  • 打赏
  • 举报
回复
引用 10 楼 bandaoyu 的回复:
[quote=引用 6 楼 zilaishuichina 的回复:] 个人倾向是: ……
上次没有认真看消化你的答复,今天再看一次,真是太赞了,你说的问题都是我们项目中曾经遇到的问题,而且罗列的确实是开发项目之前需要关注的问题,这个答案太有益了。 另外有一个还想问题你 “你现有的C/S的服务器支持一下http/https通信就可以了(有现成的第3方的支持http/https协议的库的)” 想问一下 这个和现在比较热的RESTful有什么区别[/quote] 这两不是同一类东西, 谈不上区别 restful是一种业务逻辑的设计风格,或者说是一种设计思想,而不是具体的某一段代码实现 我说的c/c++的 第3方的支持http/https协议的库 是指比如libcurl,这种现成的已经开发好的库,已经写好的代码,是偏协议底层的代码,不牵扯你的上层业务逻辑。 C/C++不像java,没有httprequest,httpresponse之类的类库的,你说你们原来的服务使用的是tcp,所以才建议你可以直接用第3方的已经做好的库,这样你的原有的C/S模式的服务器端,不需要再从零开始,去开发一套如何收发http数据包的底层了
赵4老师 2018-04-15
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); 百度搜“ReadDirectoryChangesW”,“FindFirstChangeNotification”
赵4老师 2018-04-15
  • 打赏
  • 举报
回复
我的跨*.*技术方案放之四海而皆准!
bandaoyu 2018-04-15
  • 打赏
  • 举报
回复
引用 13楼赵4老师 的回复:
我的跨*.*技术方案放之四海而皆准!
你还没有评价我的,解决并发问题的方案呢。在第12楼
bandaoyu 2018-04-15
  • 打赏
  • 举报
回复
引用 13楼赵4老师 的回复:
我的跨*.*技术方案放之四海而皆准!
说实话,确实厉害,跨语言跨平台,松耦合,而是简单实现。
bandaoyu 2018-04-14
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
仅供参考:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
    int d,r;
    FILE *f;
    char cmdstr[512];
……
赵老师,现在我遇到一个需求,打算用你提的这个方案了,那就是java 调用python脚本之后,python生成的结果如何给传给java,我现在的想法是用你的方案, java调用python 脚本结果生成json文件,然后java判断json文件是否存在,存在就读取。 你上次贴的答案没有涉及到并发的问题,我想一旦出现并发,大家的json文件名称一样的话,就会出现 A请求读到B请求结果的问题,所以我想到的解决方案是: A,B,C,D…… 都是servlet A 调用 python 并将A的进程号给python,python生成的json名是 A进程号.json B 调用 python 并将A的进程号给python,python生成的json名是 B进程号.json C 调用 python 并将A的进程号给python,python生成的json名是 C进程号.json …… 这样就解决了并发的问题。
bandaoyu 2018-04-14
  • 打赏
  • 举报
回复
引用 9 楼 DelphiGuy 的回复:
有一个开源的JNA库(https://github.com/java-native-access/jna),从Java端访问原生代码库比较方便,至少比使用JNI要方便。
感谢呀,让我多知道一个库
bandaoyu 2018-04-14
  • 打赏
  • 举报
回复
引用 6 楼 zilaishuichina 的回复:
个人倾向是: ……
上次没有认真看消化你的答复,今天再看一次,真是太赞了,你说的问题都是我们项目中曾经遇到的问题,而且罗列的确实是开发项目之前需要关注的问题,这个答案太有益了。 另外有一个还想问题你 “你现有的C/S的服务器支持一下http/https通信就可以了(有现成的第3方的支持http/https协议的库的)” 想问一下 这个和现在比较热的RESTful有什么区别
赵4老师 2018-03-07
  • 打赏
  • 举报
回复
仅供参考:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
    int d,r;
    FILE *f;
    char cmdstr[512];

    if (argc<2) {
        sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
        WinExec(cmdstr,SW_HIDE);
        for (d=1;d<=5;d++) {//共使用1..5调用B 5次
            //A将请求数据写到文件a.txt,写完后改名为aa.txt
            f=fopen("a.txt","w");
            fprintf(f,"%d\n",d);
            fclose(f);
            rename("a.txt","aa.txt");
            printf("call with %d\n",d);
            //A发现bb.txt存在时,读取其内容,读完后删除bb.txt
            while (1) {
                Sleep(100);
                if (_access("bb.txt",0)!=-1) {
                    f=fopen("bb.txt","r");
                    fscanf(f,"%d",&r);
                    fclose(f);
                    remove("bb.txt");
                    break;
                }
            }
            printf("result:%d\n",r);
        }
        return 0;
    }
    if (argv[1][0]=='a'||argv[1][0]=='A') {//A
        for (d=1;d<=5;d++) {//共使用1..5调用B 5次
            //A将请求数据写到文件a.txt,写完后改名为aa.txt
            f=fopen("a.txt","w");
            fprintf(f,"%d\n",d);
            fclose(f);
            rename("a.txt","aa.txt");
            printf("call with %d\n",d);
            //A发现bb.txt存在时,读取其内容,读完后删除bb.txt
            while (1) {
                Sleep(100);
                if (_access("bb.txt",0)!=-1) {
                    f=fopen("bb.txt","r");
                    fscanf(f,"%d",&r);
                    fclose(f);
                    remove("bb.txt");
                    break;
                }
            }
            printf("result:%d\n",r);
        }
    } else {//B
        while (1) {
            //B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
            while (1) {
                Sleep(100);
                if (_access("aa.txt",0)!=-1) {
                    f=fopen("aa.txt","r");
                    fscanf(f,"%d",&r);
                    fclose(f);
                    r=r*10;
                    f=fopen("b.txt","w");
                    fprintf(f,"%d\n",r);
                    fclose(f);
                    remove("aa.txt");
                    rename("b.txt","bb.txt");
                    break;
                }
            }
            if (r==50) break;
        }
    }
    return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>
  • 打赏
  • 举报
回复
有一个开源的JNA库(https://github.com/java-native-access/jna),从Java端访问原生代码库比较方便,至少比使用JNI要方便。
加载更多回复(7)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧