当前位置:  技术问答>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的创建。请问应该如何解决这个问题?

|
通讯归通讯,暂时撇开你要交互的是什么内容,就当成是一个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    [自解压]


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux驱动程序是怎样通过内核和应用程序通信,还有是怎样和硬件通信,跪求求解,谢谢高手留言。
  • 如何通过USB口通信
  • 进程间通过信号量通信
  • java通过stock与mysql通信时出现乱码的问题
  • 请教:arm开发板与pc通过wifi连接能ping通但无法socket通信
  • 在java里如果想写个程序,让它通过http协议来通信,怎么实现??
  • C#通过接口与线程通信(捕获线程状态)示例代码
  • 怎样通过signal在两个程序之间通信?
  • 两个进程间通过消息队列通信失败,帮忙分析原因,谢谢!
  • Python通过websocket与js客户端通信示例分析
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • applet可以不通过数字签名,通过设置IE直接在本地访问本地文件吗
  • php通过socket_bind()设置IP地址代码示例
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • 通过javascript库JQuery实现页面跳转功能代码
  • 紧急求救!能通过jdbc怎样连接sqlsever 然后通过 for xml 关键字得到xml流吗?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 我想我的网站屏蔽掉通过某些网站过来的访问,我想通过htaccess 文件来做,请大家帮帮我。
  • linux下通过crond实现自动执行程序
  • 如何通过INTERNET访问通过共项一条线路上网的局域网中的机器???
  • 通过docker commit命令保存对docker容器的修改
  • 为什么g++编译通过了,而gcc却编译通过不了???
  • 通过docker run命令运行新的docker镜像
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • 通过docker ps命令检查运行中的docker镜像
  • Jbuilder第一次编译说缺包,引入通过!然后把原来引入的注释,又通过!上帝,救我!
  • Session id实现通过Cookie来传输方法及代码参考
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • 通过docker search命令搜索可用docker镜像
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3