当前位置: 技术问答>java相关
通过Socket通信处理XML时遇到的问题,请指教
来源: 互联网 发布时间:2015-08-25
本文导语: 请先看看代码: ////////////////////////////////////////////////////// // 服务器端代码 ServerSocket s = new ServerSocket(80); try { Socket socket = s.accept(); try { InputStream instream = socket.getInputStream(); OutputStream ou...
请先看看代码:
//////////////////////////////////////////////////////
// 服务器端代码
ServerSocket s = new ServerSocket(80);
try
{
Socket socket = s.accept();
try
{
InputStream instream = socket.getInputStream();
OutputStream outstream = socket.getOutputStream();
// 在这里调用DocumentBuilder.parse(InputStream)
// 意图是解析instream生成一个DOM的文档
// 然后再从outstream写一些回复
} finally {
System.out.println("closing...");
socket.close();
}
} finally {
s.close();
}
////////////////////////////////////////////////////
// 客户端代码
Socket socket = new Socket("localhost", 80);
InputStream instream = socket.getInputStream();
OutputStream outstream = socket.getOutputStream();
PrintWriter writer = new PrintWriter(outstream);
// writer.write(一个XML文档);
writer.close(); // !就是这句有问题
// 从instream读服务器传回的回复。
上面就是简单的代码。我的问题是:如果在标记处调用writer.close(),则同时也关闭了Socket,instream就读不到服务器的回复;如果在标记处调用writer.flush(),则服务器端就会一直陷在DocumentBuilder.parse(InputStream)方法里面,永远完不成Document的创建。请问应该如何解决这个问题?
//////////////////////////////////////////////////////
// 服务器端代码
ServerSocket s = new ServerSocket(80);
try
{
Socket socket = s.accept();
try
{
InputStream instream = socket.getInputStream();
OutputStream outstream = socket.getOutputStream();
// 在这里调用DocumentBuilder.parse(InputStream)
// 意图是解析instream生成一个DOM的文档
// 然后再从outstream写一些回复
} finally {
System.out.println("closing...");
socket.close();
}
} finally {
s.close();
}
////////////////////////////////////////////////////
// 客户端代码
Socket socket = new Socket("localhost", 80);
InputStream instream = socket.getInputStream();
OutputStream outstream = socket.getOutputStream();
PrintWriter writer = new PrintWriter(outstream);
// writer.write(一个XML文档);
writer.close(); // !就是这句有问题
// 从instream读服务器传回的回复。
上面就是简单的代码。我的问题是:如果在标记处调用writer.close(),则同时也关闭了Socket,instream就读不到服务器的回复;如果在标记处调用writer.flush(),则服务器端就会一直陷在DocumentBuilder.parse(InputStream)方法里面,永远完不成Document的创建。请问应该如何解决这个问题?
|
通讯归通讯,暂时撇开你要交互的是什么内容,就当成是一个String,实际也是这样。Socket的通讯分长连接和短连接,前者的连接一直处于保持状态,直到客户端close,后者则是服务器端接受后返回时就由服务器close掉。所以为了避免无休止的read,你只能在包头里定义好每次你发包的长度,然后双方根据读到的包头(负责定义发送内容长度,状态等)解析出要读取的数据长度,这样就可以解决了。
|
你可以在服务器端定义一个无限循环来等待客户端的输入,同时对客户端的输入进行校验,当为空时就继续循环,而不要进行任何处理,客户端用flush()来控制输出达到服务器端的内容
我编写过一个这样的model,如果感兴趣,可以留个信箱给我,我发给你一份例子
祝好运
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
我编写过一个这样的model,如果感兴趣,可以留个信箱给我,我发给你一份例子
祝好运
================================================================
CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!
★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。
★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。
Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]