Socket传XML文件

huagong_adu 2011-10-18 10:57:48
现在在做一个项目,需要通过socket传XML文件。我想客户端不用生成XML文件直接发送XML的内容即可,省去IO的操作,然后在服务器端获取XML的内容直接解析,也不生成XML文件。我用Jdom生成XML字符串,然后传到服务器端,服务器端该怎么接收才能知道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;
}
...全文
1081 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tan_cheng_ok 2013-09-28
  • 打赏
  • 举报
回复
close 调用这个流关闭不就OK了
zhfally 2012-06-19
  • 打赏
  • 举报
回复
楼主 怎么设置流读取结束啊
huagong_adu 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fainfy 的回复:]

1.楼主是否想保持一个长连接?
如果不是客户端发完了关闭连接,服务器自然也就关闭了(也可以参考2)。

2.如果要保持长连接?
这里必须要有一个规范,比如当你读到了“什么”就表示读完了。

拿我现在做的IM来说吧。
客户端发送的是XMPP消息(遵守XML规范)。假设客户端发送一个如下的消息。
XML code

<iq type='set' from='juliet@capul……
[/Quote]
1楼的方法不错,我用你的方法解决了,2、3、4楼的想法也挺好,只是项目是跟人合作的,没有跟合作方提出这种规则,所以只能采用1楼的方案,谢谢各位,学习了!
Fly_m 2011-10-18
  • 打赏
  • 举报
回复
socket传输中有一个传输的协议需要遵循,即你传送了多少数据,就需要读多少数据,不多也不能少。

在你的例子中,你可以获取你要传输的xml的长度(最好是byte[]长度),然后,在byte[]数据发送之前,先发送一个长度信息,即发送的数据为

长度(固定长度如int 4byte)+数据信息

在服务器端时,首先读取长度信息,然后再读取指定长度的byte[]数据,这样就行了。

你的问题在于,服务器端不知道应该读多少信息。

while ((temp = in.readLine())
这段代码,只有在客户端中断之后才能退出,所以有问题
pengpeng107 2011-10-18
  • 打赏
  • 举报
回复
可以在头部定义一个size,size是当前xml的字节数,然后从size后开始接收。
fainfy 2011-10-18
  • 打赏
  • 举报
回复
1.楼主是否想保持一个长连接?
如果不是客户端发完了关闭连接,服务器自然也就关闭了(也可以参考2)。

2.如果要保持长连接?
这里必须要有一个规范,比如当你读到了“什么”就表示读完了。

拿我现在做的IM来说吧。
客户端发送的是XMPP消息(遵守XML规范)。假设客户端发送一个如下的消息。

<iq type='set' from='juliet@capulet.lit/chamber' id='publish2'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='urn:xmpp:avatar:metadata'>
<item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
<metadata xmlns='urn:xmpp:avatar:metadata'>
<info bytes='23456'
height='64'
id='222f4b3c50d7b0df729d299bc6f8e9ef9066971f'
type='image/gif'
url='http://avatars.example.org/happy.gif'
width='64'/>
</metadata>
</item>
</publish>
</pubsub>
</iq>


服务器读到</iq>就表示一个消息完毕了。因为这个XML消息流已经结束了。然后启动一个新的线程去处理这个消息。读数据就阻塞在这里,继续等待数据。
zhu6100441 2011-10-18
  • 打赏
  • 举报
回复
学习。。。
小绵羊 2011-10-18
  • 打赏
  • 举报
回复
用dataoutputstram

先用 writeInt發送一個xml字節數組長度,相應接收端用 readInt 接受
然後 接收端讀取對應的長度就可以了

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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