Chinaunix

标题: Linux下Socket的奇怪问题 [打印本页]

作者: 我是好人    时间: 2006-02-24 11:00
标题: Linux下Socket的奇怪问题
我遇到一个奇怪问题:

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

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

大家是不是觉得很奇怪?什么原因?我都郁闷死了!
作者: 我是好人    时间: 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. }

复制代码

作者: perryhg    时间: 2006-02-24 23:00
Windows和Linux的Socket实现本身就有差别,你不能寄望操作系统给你消息,如果有这种情况,应该自己写代码判断,你的目标是要实现什么?
作者: 我是好人    时间: 2006-02-27 16:28
原帖由 perryhg 于 2006-2-24 23:00 发表
Windows和Linux的Socket实现本身就有差别,你不能寄望操作系统给你消息,如果有这种情况,应该自己写代码判断,你的目标是要实现什么?


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

想问问大家是不是也遇到过这样的问题。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2