用JAVA做CS结构程序,现在的问题是我通讯方式使用XML方式来通讯.在客户端直接读一个XML发送到服务端, 发送没有问题我在SERVER端使用 read() 一个一个字节的收发现全部收到所有数据.但现在的问题是,我如何知道现在XML文件全部发送完了呢? 我自己不想去做这个解析. 如果使用一些现成的工具如xmlbean直接从输入端口读的话,也不会结束退出.有什么好的办法吗? 难道还要回到我原来C++的原始方式,定义一个数据包,先定义一个长度,然后再收到这个长度为止? 那使用XML通讯还有意义吗? 不知道表达的是否清楚.

解决方案 »

  1.   

    其实很简单,就是我发送一个数据包到SERVER,SERVER收到这个数据包的时候,事先是不知道数据包的长度,XML能不能设置像HTTP协议一样的,先加一个包的长度之类的。如果实在不行,我只能是在XML文件发完之后再写一个 0,然后SERVER端自己收的时候,收到0表示数据接收完毕。不过这样做也太土了吧。大家有没有什么好的建议?
      

  2.   

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

  3.   

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

  4.   

    TO:lbfhappy(千里冰封), 首先非常感谢你的帮忙.还有一个问题就是如果客户端和SERVER都是JAVA的都还好说,我写的服务端是不能限制客户端用什么方式来实现的,如果是C++的程序实现对应的 ObjectOutputStream 和 ObjectInputStream 是否能容易?
      

  5.   

    我就是感觉,XML都被人广泛使用, 应该有很成熟的代码来处理XML通讯的.本人学浅, 不知道上面的理解对不对.另外我还有一个100分的帖子和这个问题实际是一个问题,搞定问题,200分一起给.
    http://community.csdn.net/Expert/topic/5017/5017669.xml?temp=.5808527再次谢谢大家的帮助.
      

  6.   

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

  7.   

    TO:timerri() 
    --->>
    没办法,网络传输就该定义数据包或界限。
    你要想编程简单点,就一次连接只传送一个文件好了。
    <<---因为我的程序要做成长连接的.所以不能一次发送一个文件.具体原因比较复杂.
    你说的:定义数据包的界限,我现在就是想知道XML文件传输时,有没有一些标准或者现成的一些成熟通用的做法,比如像HTTP中有CONTENT-LENGTH.就是说你们以前用长连接发送XML文件,是怎么定义的?
      

  8.   

    TO: TinyJimmy
    我用SAX和DOM都试过直接从 InputStream 来解析XML文件,但我一个XML文件发送完的时候,都会一直在等侍 parse(InputStream) 上面,解析都没有问题,关键问题在传输上,我现在是写一个 0x0 做为结束,先使用
    input.read(data,0, datalen) 收取数据,直到收取到 '0' 结束的串为止.这只是一个临时方法,因为用XML就是为了通用,加一个\0我还不如改回以前定义数据包结构的方式.
      

  9.   

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

  10.   

    To: TinyJimmy(Jimmy) 
    ==============>>
    将Socket的stream直接给解析器使用,当然不会自动中止,除非流已经结束。
    要避免异常,需要设置通信超时socket.setSoTimeout(30000); 超时无数据传输自动退出
    <<===========非常感谢你的回复和关注,你上面说的我也知道,设置超时的方法是肯定不行的,因为这样发送一个数据包要等30秒才能收到回应,响应太慢了.我现在就是想知道XML在SOCKETS中的通讯协议有没有:
    1.现成的一些成熟工具来封装;
    2.一些XML的标准规定;
    3.目前通用的做法.因为用XML就是为了通用.
      

  11.   

    应用层面的封装很多,与socket封装据我所知就基于流的方式了。要么你用webservice,socket就都不需要自己来写,你只要发送你的信息即可。
      

  12.   

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

  13.   

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

  14.   

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

  15.   

    我最近也在研究
    不过没有特别好的方法
    就是定义一个类似MAp的对象,把所有的数据放入里面
    然后编程流输入输出
    有完整的代码
    JM.NET下面的就是~具体参看http://community.csdn.net/Expert/topic/5016/5016927.xml?temp=.2009088
      

  16.   

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

  17.   

    TO; wmzsl(王明哲) ( ) 对你说的一点都没错,如果是自己和自己玩,我只要在发送完了写一个0x0,就搞定.关键你写的一个SERVER做为一个产品出售的话,如果也让客户也发送一个0, 会不会降低一点产品的卖相.
      

  18.   

    zzw_happy(蒹葭苍苍) ( )我不是在做Web Server.做一个短信网关服务器程序,用户只要发送一个XML文件过来就完成了短信的发送,接收到一个XML文件就表示收到短信.现成的软件有不少,由于要有自己的知识产权,所以只能自己做了.
      

  19.   

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

  20.   

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

  21.   

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

  22.   

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

  23.   

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

  24.   

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

  25.   

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

  26.   

    非常感谢大家,经过大家的详细指教,我完全搞明白了其中的关系,特别感谢TinyJimmy(Jimmy) 和woaiwanghuan的耐心回复. 总结一下: XML其实只是定义一种数据的载体,就是信息保存的一种通用格式,而网络传输是虽要传输协议和XML无关.我可以做一个SERVER用自己的协议,然后再为客户端开发提供一个通讯包文件,最终用户只要调用一个 send(XMLContent xxx); XMLContent xxx= receive();
    就可以发送和接收XML文件.
      

  27.   

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