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());
- }
- }
- }