现在在做一个项目,需要通过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;
}
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;
}
解决方案 »
- 求帮写一条SQL高分回报
- Swing可以做出可以做出类似于eclipse的界面风格效果么?
- JTable 有没有能实现合并单元格??
- 能用JS取得<logic:iterate>标签的循环次数吗?
- 请教怎么解决,按了button后, keylistener失效的问题
- 关于引用"reference"的问题
- 各位大侠帮我看看 在如下代码中 为何我输入参数2 3 * 会出现问题(无效运算符)??? 而其他的没有问题
- 关于JTable双击表头的排序的问题。
- 请问怎么使JBuilder中的tab键设为四个字符
- java.lang.NoclassDefFoundError,怎么解决?
- 初学JAVA看什么书上手比较快
- AOP
如果不是客户端发完了关闭连接,服务器自然也就关闭了(也可以参考2)。2.如果要保持长连接?
这里必须要有一个规范,比如当你读到了“什么”就表示读完了。拿我现在做的IM来说吧。
客户端发送的是XMPP消息(遵守XML规范)。假设客户端发送一个如下的消息。<iq type='set' from='[email protected]/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消息流已经结束了。然后启动一个新的线程去处理这个消息。读数据就阻塞在这里,继续等待数据。
这段代码,只有在客户端中断之后才能退出,所以有问题
然後 接收端讀取對應的長度就可以了