java.net.SocketException引起这个异常的原因主要是由于客户端和服务器端有一端突然断开,导致另一端抛出这个异常。

java.net.BindException创建socket时如果端口被占用则抛出此异常。

奇怪的是,在有的机器上端口被占用时不会抛出BindException,而是抛出java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind。

在网上找了一圈 暂时没有找到这个问题的原因,可能和操作系统本身的tcp/ip协议有关系,目前发现在win7系统上有这个问题。

如果程序里只有创建socket服务的代码,其代码本身的逻辑就是如果创建socket服务失败就换个端口重新创建直到创建成功为止。 那么如果这里捕获到了java.net.SocketException这个异常,也可以当作端口被占用的逻辑来处理。

  1. public GetScreenServer(int port,InputStream inputstream,OutputStream outputstream) {  
  2.         this.outputstream = outputstream;  
  3.         this.inputstream = inputstream;  
  4.         this.serverPort =port;  
  5.         while (serverSkt == null) {  
  6.  
  7.                 try {  
  8.                         serverSkt = new ServerSocket(serverPort);  
  9.                 } catch (BindException be) {  
  10.                         //be.printStackTrace();  
  11.                         com.hjdf.calis.cvrs.util.CvrsSystem.println("error bin serverPort "+serverPort);  
  12.  
  13.                         serverPort++;  
  14.                 }catch(SocketException e){  
  15.                     /**  
  16.                      * java.net.SocketException引起这个异常的原因主要是由于客户端和服务器端有一端突然断开,导致另一端抛出这个异常。  
  17.                      * 但是在有的机器上端口被占用时不会抛出BindException,而是抛出java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind  
  18.                      * 暂时没有找到这个问题的原因,可能和操作系统本身的tcp/ip协议有关系,目前发现在win7系统上有这个问题。  
  19.                      * 另由于这里的代码只有创建ServerSocket,其本身的逻辑就是如果创建失败就换个端口重新创建直到创建成功为止。  
  20.                      * 故这里也可以当作端口被占有的逻辑处理。  
  21.                      */ 
  22.                     com.hjdf.calis.cvrs.util.CvrsSystem.println("error SocketException: "+serverPort);  
  23.                     serverPort++;  
  24.                 }catch(IOException e) {  
  25.                   System.err.println(e.toString());  
  26.               }  
  27.  
  28.         }  
  29.  
  30.       }