2014-12-13 59 views
0

从我的表单关闭我的TCP服务器时出现此错误。当停止我的TCP服务器时抛出SocketException java

java.net.SocketException: Socket closed 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:545) 
    at java.net.ServerSocket.accept(ServerSocket.java:513) 
    at com.hightekjonathan.HomeServer.Server.Start(Server.java:36) 
    at com.hightekjonathan.HomeServer.Form$2.run(Form.java:81) 
    at java.lang.Thread.run(Thread.java:745) 

继承人的Server.java:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.*; 
import java.util.Enumeration; 

public class Server { 
    private static ServerSocket serverSocket = null; 
    private static Socket socket = null; 
    private static DataInputStream dataInputStream = null; 
    private static DataOutputStream dataOutputStream = null; 

    private static int port = 19586; 

    private static boolean running = false; 

    public void Start() { 
     try { 
      System.out.println("Starting Server..."); 

      serverSocket = new ServerSocket(port); 

      System.out.println("Server Started"); 
      System.out.println("IP Address: " + getIpAddress()); 
      System.out.println("Listening: " + serverSocket.getLocalPort()); 

      running = true; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      System.out.println("Attempting to connect to clients..."); 
      socket = serverSocket.accept(); 

      dataInputStream = new DataInputStream(socket.getInputStream()); 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 

      System.out.println("ip: " + socket.getInetAddress()); 
      System.out.println("message: " + dataInputStream.readUTF()); 

      dataOutputStream.writeUTF("connected"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void Stop() { 
     if (running) { 
      if (socket != null) { 
       try { 
        socket.close(); 
        socket = null; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      if (dataInputStream != null) { 
       try { 
        dataInputStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      if (dataOutputStream != null) { 
       try { 
        dataOutputStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      if (serverSocket != null) { 
       try { 
        serverSocket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      running = false; 
     } 
    } 

    private String getIpAddress() { 
     String ip = ""; 
     try { 
      Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces(); 
      while (enumNetworkInterfaces.hasMoreElements()) { 
       NetworkInterface networkInterface = enumNetworkInterfaces.nextElement(); 
       Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses(); 
       while (enumInetAddress.hasMoreElements()) { 
        InetAddress inetAddress = enumInetAddress.nextElement(); 

        if (inetAddress.isSiteLocalAddress()) { 
         ip += inetAddress.getHostAddress(); 
        } 
       } 
      } 

     } catch (SocketException e) { 
      e.printStackTrace(); 
      ip += "Something Wrong! " + e.toString() + "\n"; 
     } 

     return ip; 
    } 

    public boolean isRunning() { 
     return running; 
    } 
} 

其使用此功能并开始一个新的线程从我的GUI形式:

button.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     buttonActionPerformed(evt); 
    } 
); 

然后buttonActionPerformed()是这样的:

private void buttonActionPerformed(java.awt.event.ActionEvent evt) { 
    if (!server.isRunning()) { 
     Runnable r = new Runnable() { 
      public void run() { 
       server.Start(); 
      } 
     }; 
     new Thread(r).start(); 

     button.setText("Stop Server"); 
     serverStatus.setText("Server: Started"); 
    } else { 
     server.Stop(); 

     button.setText("Start Server"); 
     serverStatus.setText("Server: Stopped"); 
    } 
} 

e当没有客户端连接时,我停止服务器时才会出现rror。但是,当一个客户端连接,然后断开连接,我没有得到那个错误。它正确地关闭它,我只是想确保错误不会是一个严重的问题,或者如果有一个简单的方法来修复它。

回答

1

当你启动你的服务器时,你调用serverSocket.accept()。这个调用会阻塞线程直到建立连接。通过调用server.stop(),您正在另一个线程中关闭此服务器套接字。 ServerSocket.close()JavaDoc说: Any thread currently blocked in {@link #accept()} will throw a {@link SocketException}.

所以这就是为什么你得到这个异常。

我想你可以忽略这个例外。

P.S. 而且你应该让你的boolean running不稳定。

+0

是的 - 只是转储异常。 – 2014-12-13 14:02:51

+0

所以它应该是安全的忽略? – hightekjonathan 2014-12-13 16:33:42

+0

@pomkine所以把布尔设置为这个'private static volatile boolean running = false;'?或者在检索时将其设置为volatile? – hightekjonathan 2014-12-13 16:35:37

相关问题