如何不生成XML文件通过Socket传XML文件内容

    最近做项目碰到一个问题,想在客户端生成XML文件内容,但不在硬盘上创建文件(没这个需求),可以减少I/O操作,提高效率,改为直接发送XML内容。发现Jdom还是挺好用的,直接用下面一点代码就可以完成这项任务,生成XML字符串

//省略生成XML的代码
Document doc = new Document(root);
XMLOutputter XMLOut = new XMLOutputter(format);
//生成XML字符串,即XML文件的内容,包含很多换行符
String xmlString = XMLOut.outputString(doc);
//发送XML字符串
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(xmlString);
out.flush();


    但是遇到一个问题,因为要保持长连接,在服务器端怎么知道文件内容传完了呢?服务器端一开始的代码如下,一直发生超时异常

BufferedReader in = new BufferedReader(new InputStreamReader(processSocket.getInputStream()));
String msg = "";
String temp = "";
///
//这里读完后就阻塞了,抛出异常,该怎么样才能知道XML文件内容传完了呢?//
///
while ((temp = in.readLine()) != null) {
    msg += temp;
}


    为了解决这个问题,搜了好久,始终没有找到答案,后来特意在论坛发了个帖子问了一下,终于明白了,帖子地址:http://topic.csdn.net/u/20111018/10/6843bbbe-7307-4523-bc39-699224b5efbf.html

    原来如果是短连接,客户端发完数据后会直接关掉套接字,服务器端的readline()会接受到null,那么我的程序可以正常运行。但因为是长连接,所以客户端的套接字等待服务器端的数据处于阻塞状态,客户端发完数据后,服务器端readline() 因为等待对方的数据,对方已经阻塞,互相等待,形成死锁,所以才发生超时。

    解决办法有两个:

一、规定客户端每次发数据前先发数据的长度再发数据,服务器端先接收数据大小,再根据这个大小创建相应长度的数组接收数据;

二、根据XML的格式,当读到XML结束的标志是表示数据接收完毕。

    因为项目合作原因,最终采用第二种方法,把问题解决了。

    PS:之前在搜这个问题时也遇到一些类似不保存XML文件直接发数据内容的东西,有提到用web service 的,什么SOAP之类的也是用来这种应用,有空可以研究一下。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值