日期:2014-05-20  浏览次数:20764 次

JAVA SOCKET与TUXEDO通信的问题
现在我这边的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的特性。不知道各位有没有遇到这样的问题,有请分享一下。


------解决方案--------------------
我不明白楼主的意思。

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

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

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

如果你的数据是8字节长度+真正的数据,
那你接收方就应该先固定读取8字节,然后再根据长度启动第二次读,
这样,就不可能有你说的一次性收到两批报文的问题。
------解决方案--------------------
大致上,模糊地明白了楼主的意思。
首先,看收发双方是否都使用了Java做的开发,
如果是,那DataOutputStream使用得不太纯粹。
如果不是,那不要使用DataOutputStream类进行收发操作,因为DataOutputStream在写入IO流时数据之间会有分隔符。

其次,坦白说,我不了解TUXEDO是什么意思,但是,如果我没理解错的话。
解决楼主的问题,只需要去掉DataOutputStream的使用就可以了,
实际上OutputStream提供了write和flush两个方法。
------解决方案--------------------
Java code
//感觉和JDK的版本无关,楼主尝试以下代码:
OutputStream os = socket.getOutputStream(); 
os .write(returnLen);//returnLen要求是byte类型的数据或者是长度为1的byte数组,因为1byte=8bit
os .flush(); //这句可以省略不写。
os .write(message);//要求是正确‘编码’后字节数组。
os .flush();