JAVA SOCKET与TUXEDO通信的问题

冯立彬
架构领域优质创作者
2009-06-02 07:40:34
现在我这边的SOCKET作为TUXEDO发送报文的接收服务端,在返回数据给TUXEDO的时候,现在遇到一个问题,就是同一个SOCKET连接不能够将消息分批返回给TUXEDO,
因为TUXEDO要求第一个报文为8位的后续报文长度,然后再发送后续报文,必须分开发,否则不能够正常接收。
我记得在JDK1.4的时候,我们做通讯测试的时候,可以将报文分两次发送,后面因为要使用到线程池,就换成了JDK1.5,结果现在不能够分两个次发送,我尝试了JDK1.6_U18也不行,我的程序如下:
...
dos=new DataOutputStream(socket.getOutputStream());
dos.writeBytes(returnLen);//先发送报文长度
dos.flush();
dos.writeBytes(message);//先发送报文长度
dos.flush();
...
采用JDK5以上的版本按这样的程序发送的时候,他会报两个一起发送,我的SOCKET测试客户就可以检测,因为我的SOCKET客户端在收到消息后就会立刻退出,不会等后面的报文,结果打印出来的就是长度加后续报文。
我曾尝试(1):
...
dos=new DataOutputStream(socket.getOutputStream());
dos.writeBytes(returnLen);//先发送报文长度
dos.flush();
dos=new DataOutputStream(socket.getOutputStream());
dos.writeBytes(message);//先发送报文长度
dos.flush();
...
(2):
...
dos=new DataOutputStream(socket.getOutputStream());
dos.writeBytes(returnLen);//先发送报文长度
dos.flush();
dos.close();这里会把SOCKET也关掉,后面的就发不出去了,报异常
dos=new DataOutputStream(socket.getOutputStream());
dos.writeBytes(message);//先发送报文长度
dos.flush();
...

现在想换到JDK1.4测试也不能够了,因为其它的关键地方也使用JDK5的特性。不知道各位有没有遇到这样的问题,有请分享一下。
...全文
273 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2009-06-03
  • 打赏
  • 举报
回复
//感觉和JDK的版本无关,楼主尝试以下代码:
OutputStream os = socket.getOutputStream();
os .write(returnLen);//returnLen要求是byte类型的数据或者是长度为1的byte数组,因为1byte=8bit
os .flush(); //这句可以省略不写。
os .write(message);//要求是正确‘编码’后字节数组。
os .flush();
冰思雨 2009-06-03
  • 打赏
  • 举报
回复
大致上,模糊地明白了楼主的意思。
首先,看收发双方是否都使用了Java做的开发,
如果是,那DataOutputStream使用得不太纯粹。
如果不是,那不要使用DataOutputStream类进行收发操作,因为DataOutputStream在写入IO流时数据之间会有分隔符。

其次,坦白说,我不了解TUXEDO是什么意思,但是,如果我没理解错的话。
解决楼主的问题,只需要去掉DataOutputStream的使用就可以了,
实际上OutputStream提供了write和flush两个方法。
冯立彬 2009-06-03
  • 打赏
  • 举报
回复

那你接收方就应该先固定读取8字节,然后再根据长度启动第二次读,
这样,就不可能有你说的一次性收到两批报文的问题。

分两次读数,据我了解这个其实是TUXEDO的机制,他不会将一个字符串收到后拆分后去读,
所以才会有这样的问题,对方的TUXEDO也不可能去修改,因为对方的TUXEDO也是和多方通信
冯立彬 2009-06-03
  • 打赏
  • 举报
回复
犯了一个低级错误,对方原来不是用TUXEDO发送的报文,我一直以为对方使用的是TUXEDO发送的报文,就是用的TCP/IP协议与我进行的通信。
我的报文也是发过去了的,只是那边解析没有正确,一直显示收到的为空,后面由对方修改程序,问题搞定。
我咋就这么背了,给自己找不快,不过这个分次给对方发报文还是没有解决,暂时先放下了。
冯立彬 2009-06-03
  • 打赏
  • 举报
回复
TUXEDO是一个中间件,也主要是用是报文收发的,应该是原BEA的一个产品,这个你可以网上搜索,主要用于C及C++通信报文的处理,
我尝试你提供的思路也不行,得到的是想同的结果
jinxfei 2009-06-02
  • 打赏
  • 举报
回复
我不明白楼主的意思。

因为网络上都是字节流,没有批的概念,
所以我觉得无论你发送端怎么发,都不应该影响接收端啊,

你应该从逻辑上保证接收数据的顺序和批次,而不是靠发送方的flush次数来区分数据啊。

不知道你是否明白我的意思。

如果你的数据是8字节长度+真正的数据,
那你接收方就应该先固定读取8字节,然后再根据长度启动第二次读,
这样,就不可能有你说的一次性收到两批报文的问题。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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