为啥 Corba VisiBroker java 服务器应用程序向同一个客户端回复不同的 GIOP 消息?

Posted

技术标签:

【中文标题】为啥 Corba VisiBroker java 服务器应用程序向同一个客户端回复不同的 GIOP 消息?【英文标题】:Why Corba VisiBroker java server app replies with different GIOP messages to the same client?为什么 Corba VisiBroker java 服务器应用程序向同一个客户端回复不同的 GIOP 消息? 【发布时间】:2018-02-20 16:07:39 【问题描述】:

我在两台不同的 UNIX 机器上部署了相同版本的 Java Corba Server 应用程序,但操作系统 Red Hat Linux 的版本相同。与同一个客户端连接并发送一条消息,我收到了看似正确的回复,但带有不同的代码库长度消息。

通信是同步的,客户端调用服务器对象上的一个方法,该方法返回一个对象。

以下是来自服务器 1 和服务器 2 的两个回复消息示例:

47 49 4F 50 01 02 00 01 00 00 00 00 00 00 08 E6  GIOP............
00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 10  ................
00 4C 00 6F 00 67 00 69 00 6E 00 20 00 4F 00 4B  .L.o.g.i.n. .O.K
00 00 00 26 00 4C 00 6F 00 67 00 69 00 6E 00 20  ...&.L.o.g.i.n. 
00 52 00 65 00 71 00 75 00 65 00 73 00 74 00 20  .R.e.q.u.e.s.t. 
00 52 00 65 00 70 00 6C 00 79 00 00 00 00 00 A2  .R.e.p.l.y......
00 4C 00 6F 00 67 00 69 00 6E 00 52 00 65 00 71  .L.o.g.i.n.R.e.q
00 75 00 65 00 73 00 74 00 20 00 66 00 72 00 6F  .u.e.s.t. .f.r.o
00 6D 00 20 00 5B 00 63 00 6C 00 69 00 65 00 6E  .m. .[.c.l.i.e.n
00 74 00 3D 00 20 00 2D 00 20 00 73 00 65 00 73  .t.=. .-. .s.e.s
00 73 00 69 00 6F 00 6E 00 49 00 44 00 3D 00 31  .s.i.o.n.I.D.=.1
00 36 00 35 00 33 00 34 00 34 00 39 00 30 00 32  .6.5.3.4.4.9.0.2
00 32 00 5D 00 20 00 74 00 6F 00 20 00 52 00 54  .2.]. .t.o. .R.T
00 50 00 6F 00 73 00 65 00 50 00 72 00 6F 00 76  .P.o.s.e.P.r.o.v
00 69 00 64 00 65 00 72 00 2C 00 20 00 72 00 65  .i.d.e.r.,. .r.e
00 61 00 73 00 6F 00 6E 00 20 00 3A 00 20 00 4F  .a.s.o.n. .:. .O
00 4B 00 00 62 8D A1 3E                          .K..b..>



47 49 4F 50 01 02 00 01 00 00 00 00 00 00 0D E4  GIOP............
00 00 00 00 00 00 00 00 01 00 00 26 00 00 00 09  ...........&....
4C 6F 67 69 6E 20 4F 4B 00 6D 79 5F 00 00 00 14  Login OK.my_....
4C 6F 67 69 6E 20 52 65 71 75 65 73 74 20 52 65  Login Request Re
70 6C 79 00 00 00 00 52 4C 6F 67 69 6E 52 65 71  ply....RLoginReq
75 65 73 74 20 66 72 6F 6D 20 5B 63 6C 69 65 6E  uest from [clien
74 3D 20 2D 20 73 65 73 73 69 6F 6E 49 44 3D 31  t= - sessionID=1
37 36 35 35 32 31 31 31 39 5D 20 74 6F 20 52 54  765521119] to RT
50 6F 73 65 50 72 6F 76 69 64 65 72 2C 20 72 65  PoseProvider, re
61 73 6F 6E 20 3A 20 4F 4B 00                    ason : OK.

似乎在第一种情况下,它使用 2 个字节作为 char,而在第二种情况下,它仅使用一个字节来编码 char(但不确定)。在第二条消息中,客户端无法读取此流(即使对我来说很难,看起来还不错)

问题是什么配置决定了这一点?两个服务器 IDL 对象似乎具有相同的功能。客户端和服务器的 IDL 相同(相同版本)。两者都是 Java 应用程序,相同版本的 JVM。

我确定这与服务器 Linux 机器有关(默认为一个或另一个),但不知道究竟是什么触发了这种行为。

Corba 的版本是 Visibroker 8.5。

有人可以指点我一些东西,任何东西...... :) 我可以在服务器端做什么(任何配置)?在客户端呢?

【问题讨论】:

哇,人们还在用这个吗?考虑网络服务 为了与旧版客户端向后兼容,我们不能强制他们迁移 :) 【参考方案1】:

错误的类路径!似乎这种行为是由于我在类路径中有两次相同的接口:一个用于 java,另一个用于 .NET 客户端。完成清理后,一切都按预期工作!

【讨论】:

以上是关于为啥 Corba VisiBroker java 服务器应用程序向同一个客户端回复不同的 GIOP 消息?的主要内容,如果未能解决你的问题,请参考以下文章

CORBA:它是啥,为啥会产生“GIOP 魔法错误”?

为啥 CORBA 接口有返回类型和 out 关键字?

为啥我的 CORBA 服务器没有绑定?

Delphi 7 中的 Orbix 客户端

Corba 客户端 - Python 和 Corba 服务器 - Java

ubuntu 中的 Java 和 CORBA