java.net.SocketException引发这个异常的缘由主要是因为客户端和服务器端有一端忽然断开,致使另外一端抛出这个异常。java
java.net.BindException建立socket时若是端口被占用则抛出此异常。服务器
奇怪的是,在有的机器上端口被占用时不会抛出BindException,而是抛出java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind。socket
在网上找了一圈 暂时没有找到这个问题的缘由,可能和操做系统自己的tcp/ip协议有关系,目前发如今win7系统上有这个问题。tcp
若是程序里只有建立socket服务的代码,其代码自己的逻辑就是若是建立socket服务失败就换个端口从新建立直到建立成功为止。 那么若是这里捕获到了java.net.SocketException这个异常,也能够看成端口被占用的逻辑来处理。ide
- public GetScreenServer(int port,InputStream inputstream,OutputStream outputstream) {
- this.outputstream = outputstream;
- this.inputstream = inputstream;
- this.serverPort =port;
- while (serverSkt == null) {
- try {
- serverSkt = new ServerSocket(serverPort);
- } catch (BindException be) {
- //be.printStackTrace();
- com.hjdf.calis.cvrs.util.CvrsSystem.println("error bin serverPort "+serverPort);
- serverPort++;
- }catch(SocketException e){
- /**
- * java.net.SocketException引发这个异常的缘由主要是因为客户端和服务器端有一端忽然断开,致使另外一端抛出这个异常。
- * 可是在有的机器上端口被占用时不会抛出BindException,而是抛出java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
- * 暂时没有找到这个问题的缘由,可能和操做系统自己的tcp/ip协议有关系,目前发如今win7系统上有这个问题。
- * 另因为这里的代码只有建立ServerSocket,其自己的逻辑就是若是建立失败就换个端口从新建立直到建立成功为止。
- * 故这里也能够看成端口被占有的逻辑处理。
- */
- com.hjdf.calis.cvrs.util.CvrsSystem.println("error SocketException: "+serverPort);
- serverPort++;
- }catch(IOException e) {
- System.err.println(e.toString());
- }
- }
- }