站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题[100分] 关于Java Socket的收取一个完整的数据包的问题.

[100分] 关于Java Socket的收取一个完整的数据包的问题.

摘要: [100分] 关于Java Socket的收取一个完整的数据包的问题.


用JAVA做CS结构程序,现在的问题是我通讯方式使用XML方式来通讯.

在客户端直接读一个XML发送到服务端, 发送没有问题我在SERVER端使用 read() 一个一个字节的收发现全部收到所有数据.

但现在的问题是,我如何知道现在XML文件全部发送完了呢? 我自己不想去做这个解析. 如果使用一些现成的工具如xmlbean直接从输入端口读的话,也不会结束退出.

有什么好的办法吗? 难道还要回到我原来C++的原始方式,定义一个数据包,先定义一个长度,然后再收到这个长度为止? 那使用XML通讯还有意义吗? 不知道表达的是否清楚.


up


帮顶
又看见二楼。。


其实很简单,就是我发送一个数据包到SERVER,SERVER收到这个数据包的时候,事先是不知道数据包的长度,XML能不能设置像HTTP协议一样的,先加一个包的长度之类的。

如果实在不行,我只能是在XML文件发完之后再写一个 0,然后SERVER端自己收的时候,收到0表示数据接收完毕。

不过这样做也太土了吧。大家有没有什么好的建议?


mark!


你可以定义成一个对象,你可以把数据封装在对象里面
然后用ObjectOutputStream把这个对象写出到流里面
那边就用ObjectInputStream把这个对象从流里面读出来就可以了
这样就可以把一些数据全部封装在一个对象里面,
不过要记住,你的这个类一定要实现Serializable这个接口,否则会报错,串行化不了
这个接口是一个空接口,只要声明实现就可以了
祝你成功


同意lbfhappy(千里冰封)的话,用ObjectI/OStream封装流发送接收,是否结束都由java自动控制,自己只管用readObject()读就行了!


没办法,网络传输就该定义数据包或界限。
你要想编程简单点,就一次连接只传送一个文件好了。


TO:lbfhappy(千里冰封), 首先非常感谢你的帮忙.

还有一个问题就是如果客户端和SERVER都是JAVA的都还好说,我写的服务端是不能限制客户端用什么方式来实现的,如果是C++的程序实现对应的 ObjectOutputStream 和 ObjectInputStream 是否能容易?


我就是感觉,XML都被人广泛使用, 应该有很成熟的代码来处理XML通讯的.

本人学浅, 不知道上面的理解对不对.

另外我还有一个100分的帖子和这个问题实际是一个问题,搞定问题,200分一起给.
http://community.csdn.net/Expert/topic/5017/5017669.xml?temp=.5808527

再次谢谢大家的帮助.


可以使用SAX或StAX。都是支持流数据的XML解析方法


TO:timerri()
--->>
没办法,网络传输就该定义数据包或界限。
你要想编程简单点,就一次连接只传送一个文件好了。
<<---

因为我的程序要做成长连接的.所以不能一次发送一个文件.具体原因比较复杂.
你说的:定义数据包的界限,我现在就是想知道XML文件传输时,有没有一些标准或者现成的一些成熟通用的做法,比如像HTTP中有CONTENT-LENGTH.

就是说你们以前用长连接发送XML文件,是怎么定义的?




TO: TinyJimmy
我用SAX和DOM都试过直接从 InputStream 来解析XML文件,但我一个XML文件发送完的时候,都会一直在等侍 parse(InputStream) 上面,

解析都没有问题,关键问题在传输上,我现在是写一个 0x0 做为结束,先使用
input.read(data,0, datalen) 收取数据,直到收取到 '0' 结束的串为止.

这只是一个临时方法,因为用XML就是为了通用,加一个/0我还不如改回以前定义数据包结构的方式.


将Socket的stream直接给解析器使用,当然不会自动中止,除非流已经结束。当你的文件发送完了,应该由发送放关闭流和Socket,正常中止传输。要避免异常,需要设置通信超时socket.setSoTimeout(30000); 超时无数据传输自动退出


To: TinyJimmy(Jimmy)
==============>>
将Socket的stream直接给解析器使用,当然不会自动中止,除非流已经结束。
要避免异常,需要设置通信超时socket.setSoTimeout(30000); 超时无数据传输自动退出
<<===========

非常感谢你的回复和关注,你上面说的我也知道,设置超时的方法是肯定不行的,因为这样发送一个数据包要等30秒才能收到回应,响应太慢了.

我现在就是想知道XML在SOCKETS中的通讯协议有没有:
1.现成的一些成熟工具来封装;
2.一些XML的标准规定;
3.目前通用的做法.

因为用XML就是为了通用.


应用层面的封装很多,与socket封装据我所知就基于流的方式了。

要么你用webservice,socket就都不需要自己来写,你只要发送你的信息即可。


xml仅是一个格式规范,而不是一个传输协议。它不负责解决传输上存在的问题。
通用的做法是把xml当文件操作,基于一些已有的传输协议,如http

对于流方式解析xml,可以考虑用StAX。


webservice
推荐


Webservice 就是说使用http做为通讯使用的协议?
有一个东西不懂,想问一下WebService 可以做为长连接吗?


不能, webservice完成一次对话就自动断了. 不过一次对话你可传足够多的信息


makr


做一个协议就行了,你写一个协议,加一些头信息,和结尾信息不就能确定是不是收全了


我最近也在研究
不过没有特别好的方法
就是定义一个类似MAp的对象,把所有的数据放入里面
然后编程流输入输出


有完整的代码
JM.NET下面的就是~

具体参看

http://community.csdn.net/Expert/topic/5016/5016927.xml?temp=.2009088


xml 作协议,你是在做web service吗?
那样的话用axis包吧。




TO; wmzsl(王明哲) ( )

对你说的一点都没错,如果是自己和自己玩,我只要在发送完了写一个0x0,就搞定.

关键你写的一个SERVER做为一个产品出售的话,如果也让客户也发送一个0, 会不会降低一点产品的卖相.


zzw_happy(蒹葭苍苍) ( )

我不是在做Web Server.做一个短信网关服务器程序,用户只要发送一个XML文件过来就完成了短信的发送,接收到一个XML文件就表示收到短信.

现成的软件有不少,由于要有自己的知识产权,所以只能自己做了.


最近也在研究这方面的东东,关注....


mark


同意N层上一个人的说话,XML不负责传输,它只定义传输内容的格式,有个这种格式,内容
就很容易被理解!
你只要把传输XML看做传输普通的文件就可以了,所以你完全可以自己定义数据包,比如结尾加'/0',或者定义传输长度,或者干脆使用http作为传输协议,这就是通用的做法!

还有,为什么非要长时间保持连接呢?这很消耗资源的!


fz_zhou(vcfan):
给你具体解释XML在你的程序中的用途!
客户端和服务器之间传送短信,必须定义个协议,比如"接收号码,内容","13814018186,你好",采用这种格式,你知道是什么意思,但是别人就不容易理解了,如果格式比较复杂,就更不容易理解!
采用xml,就很容易理解,比如

13814018186
你好

这就是xml的用途!


如果想讨论,给我发站内消息!
我很少再次看参与过的帖子!


数据本身用xml形式来发送。
比如 woaiwanghuan(我不学习是猪) 解释的那样
或者找xml通讯类了 ,apache组织有很多。


socket通信有通信的规则, 如果你希望保持长连接, 就应该有个通信协议, 包括写入/0也是规则的一部分, 传完一个文件等待下一个. 要可不保持长连接, 可使用webservice, 这样你的协议变的更为可读, 更容易包装成产品.

看你的程序希望read结束, 不象是希望保持长连接的样子, 晕ing


up


Mark~


如果字符串不是太大的话,可以考虑一下使用sendutf。按照这种方式发送出去的字符串,其前面有2个字节是作为字符串长度字段的,接收时也可以自动识别出这个长度,并且在完全接收到字符串时才返回。
但是注意,这只有2个字节。如果你发送的文件超过了64KB,那么最好还是自己用这种方式定义一下。每次发送数据之前,先发送一下字符串的长度值,然后再发送字符串。
另外注意,在发送这个整数值的时候,需要做一下转换,因为本机字节序和网络字节序也许不同。当然,Java中是否相同我没有实际测试过。


文本格式通讯的协议,一般有两种方式:一种是定义一个特殊字符作为结束符,接收端一个字符一个字符接收;另一种是先发送数据长度。


To fz_zhou(vcfan) (
产品也是这样的,无论什么通讯都要有协议的,只要是协议一般就都有开始和结尾标记!
如果什么都没有,根本就没法通讯!



学习!!+JF


顶,我们一直用xml传输数据,一开始就是定义了消息头和尾,用sock长连接,
没象楼主在这里和大家讨论的这么深,就是直接只传送xml,这样行么?我也长见识了


非常感谢大家,经过大家的详细指教,我完全搞明白了其中的关系,特别感谢TinyJimmy(Jimmy) 和woaiwanghuan的耐心回复.

总结一下: XML其实只是定义一种数据的载体,就是信息保存的一种通用格式,而网络传输是虽要传输协议和XML无关.我可以做一个SERVER用自己的协议,然后再为客户端开发提供一个通讯包文件,最终用户只要调用一个 send(XMLContent xxx); XMLContent xxx= receive();
就可以发送和接收XML文件.




timerri说得很对



致于为什么不用长连接,是这样的.

我做的SERVER程序可能在一秒种要能处理几百条的用户手机发送来的短信.
我的理解是在一秒内如果建100个连接再断开,比建一个连接发送100次数据而言,应该是后者的效率高很多.

而且每次短连接还要带很多重复信息,而长连接只要连接的时候发送就可以.


楼主连XML都没搞清楚,是有点不太对了,不过最后差不多了,不错。
至于使用长连接?
你的理解错了,你这样做光看连接,性能是提高了,但系统的整体性能反而降低了。
得不偿失啊。题外话..........


↑返回目录
前一篇: JBuilder设计图形界面问题
后一篇: private 方法 和 final 方法 在继承中的区别! 老鸟进!!!!!