免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1806 | 回复: 3
打印 上一主题 下一主题

Linux下Socket的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-24 11:00 |只看该作者 |倒序浏览
我遇到一个奇怪问题:

一个简单的Socket通信(阻塞方式),都在Windows下,Server程序一中止,Client立即抛出IOException,但如果Server装在Linux下,程序中止后,Client无异常抛出,仍然阻塞在read方法上。

另外,反过来,Server在Windows上,Client在Linux上,Client中止后,Server可以抛出IOException,但如果Client的Linux重新启动,Server端无异常抛出,让阻塞在read方法上。

大家是不是觉得很奇怪?什么原因?我都郁闷死了!

论坛徽章:
0
2 [报告]
发表于 2006-02-24 11:02 |只看该作者
第一种情况的程序:

Server.java

  1. import java.io.BufferedOutputStream;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;

  5. public class Server {
  6.    
  7.     private ServerSocket serverSocket;
  8.    
  9.     private int port = 10000;
  10.    
  11.     private Socket socket;
  12.    
  13.     private BufferedOutputStream out;
  14.    
  15.     private String x = "abcd";
  16.    
  17.     public Server() {
  18.         try {
  19.             serverSocket = new ServerSocket(port);
  20.         } catch (IOException e) {
  21.             e.printStackTrace();
  22.         }
  23.     }
  24.    
  25.     public void run() {
  26.         if ((serverSocket != null)&&(serverSocket.isBound())) {
  27.             try {
  28.                 socket = serverSocket.accept();
  29.                 out = new BufferedOutputStream(socket.getOutputStream());
  30.             } catch (IOException e) {
  31.                 e.printStackTrace();
  32.             }
  33.         }
  34.         try {
  35.             out.write(x.getBytes());
  36.             out.flush();
  37.         } catch (IOException e) {
  38.             e.printStackTrace();
  39.         }
  40.         try {
  41.             Thread.sleep(10000);
  42.         } catch (InterruptedException e1) {
  43.             e1.printStackTrace();
  44.         }
  45.     }

  46.     /**
  47.      * @param args
  48.      */
  49.     public static void main(String[] args) {
  50.         Server server = new Server();
  51.         server.run();
  52.     }

  53. }
复制代码


Client.java

  1. import java.io.BufferedInputStream;
  2. import java.io.IOException;
  3. import java.net.SocketTimeoutException;
  4. import java.net.InetSocketAddress;
  5. import java.net.Socket;

  6. public class Client {
  7.    
  8.     private Socket socket;
  9.    
  10.     private BufferedInputStream in;
  11.    
  12.     private byte[] buf;
  13.    
  14.     private byte[] data;
  15.    
  16.     public Client() {
  17.         socket = new Socket();
  18.         try {
  19.             socket.connect(new InetSocketAddress("10.5.6.79", 10000), 5000);
  20.             in = new BufferedInputStream(socket.getInputStream());
  21.         } catch (IOException e) {
  22.             e.printStackTrace();
  23.         }
  24.     }
  25.    
  26.     public void run() {
  27.         while (true) {
  28.             try {
  29.                 buf = new byte[1000];
  30.                 int len = in.read(buf);
  31.                 System.out.println("len = " + len);
  32.                 data = new byte[len];
  33.                 System.arraycopy(buf, 0, data, 0, len);
  34.                 System.out.println("Recv: " + new String(data));
  35.             } catch (SocketTimeoutException e) {
  36.                 e.printStackTrace();
  37.             } catch (IOException e) {
  38.                 e.printStackTrace();
  39.                 return;
  40.             }
  41.         }
  42.     }
  43.    
  44.     public static void main(String[] args) {
  45.         Client client = new Client();
  46.         client.run();
  47.     }

  48. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2006-02-24 23:00 |只看该作者
Windows和Linux的Socket实现本身就有差别,你不能寄望操作系统给你消息,如果有这种情况,应该自己写代码判断,你的目标是要实现什么?

论坛徽章:
0
4 [报告]
发表于 2006-02-27 16:28 |只看该作者
原帖由 perryhg 于 2006-2-24 23:00 发表
Windows和Linux的Socket实现本身就有差别,你不能寄望操作系统给你消息,如果有这种情况,应该自己写代码判断,你的目标是要实现什么?


我并不是想实现什么(想实现的已经实现了),我只是觉得很奇怪!

想问问大家是不是也遇到过这样的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP