日期:2014-05-20 浏览次数:20893 次
//省略生成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; }
<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>
------解决方案--------------------
可以在头部定义一个size,size是当前xml的字节数,然后从size后开始接收。
------解决方案--------------------
socket传输中有一个传输的协议需要遵循,即你传送了多少数据,就需要读多少数据,不多也不能少。
在你的例子中,你可以获取你要传输的xml的长度(最好是byte[]长度),然后,在byte[]数据发送之前,先发送一个长度信息,即发送的数据为
长度(固定长度如int 4byte)+数据信息
在服务器端时,首先读取长度信息,然后再读取指定长度的byte[]数据,这样就行了。
你的问题在于,服务器端不知道应该读多少信息。
while ((temp = in.readLine())
这段代码,只有在客户端中断之后才能退出,所以有问题
------解决方案--------------------
用dataoutputstram
先用 writeInt發送一個xml字節數組長度,相應接收端用 readInt 接受
然後 接收端讀取對應的長度就可以了