2011-11-24 125 views
4

我想创建能够与多个客户端连接的服务器。 我的主要功能是:套接字例外:套接字已关闭

ServerSocket serverSocket = null; 
    try { 
     serverSocket = new ServerSocket(5556); 
    } catch (IOException ex) { 
     Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    while (true) { 
     try { 
      Socket connection = serverSocket.accept(); 
      PlayerConnection playerConn = new PlayerConnection(connection); 
      playerConn.start(); 
     } catch (IOException ex) { 
      System.out.println("Nie można było utworzyć gniazda."); 
     } 
    } 

PlayerConnection是一个Thread类。 run方法:

public void run() { 
    InputStream input = null; 
    while (true) { 
     try { 
      input = connection.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
      String msg = reader.readLine(); 
      System.out.println(msg); 

     } catch (IOException ex) { 
      Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 
    } 
} 

当我运行客户端和发送消息给它接收的服务器,但是,接下来将在循环迭代connection.getInputStream();抛出一个Socket异常套接字被关闭。为什么?

java.net.SocketException: socket closed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:150) 
at java.net.SocketInputStream.read(SocketInputStream.java:121) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:154) 
at java.io.BufferedReader.readLine(BufferedReader.java:317) 
at java.io.BufferedReader.readLine(BufferedReader.java:382) 
at makaoserver.PlayerConnection.run(PlayerConnection.java:38) 
+0

你读循环应该结束的时候'的readLine()''返回null'。目前,当对端关闭连接时,您会收到无尽的'null'消息。 – EJP

回答

6

将输入流和缓冲读取器放在循环之外。

可能创建多个流连接到相同的输入流造成这种情况。

+0

但我想从客户端获得多条消息。如果你把输入流和缓冲阅读器放在循环之外,我只会得到一条消息。 – latata

+0

没有一次你有输入流的句柄,你不需要继续初始化它。你的readline仍然会在循环中收集消息。 –

+0

我得到相同的异常:( – latata

0

尝试

public void run() { 
    InputStream input = null; 
    input = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 

    while (true) { 
     try { 
      String msg = reader.readLine(); 
      System.out.println(msg); 
     } catch (IOException ex) { 
      Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 
    } 
} 

另外不要忘记关闭插座,当你与他们做

try { 
    // Create objects 
    // do stuff 
} finally { 
    if (obj != null) obj.close(); 
} 
+0

我已经完成了它,但我仍然得到相同的异常 – latata

+0

您说过连接关闭的异常在第二遍循环中的connection.getInputStream()上抛出,该行不再在循环中,现在抛出的异常在哪里呢?你还可以为你展示一些来自PlayerConnection的代码可能会关闭服务器端的连接。 –

+1

我解决了这个问题。 :)我正在打开一个OutputStream也引起异常。 – latata