2013-04-06 36 views
2

我有服务器和客户端。 我的服务器接受所有连接并返回到客户端字符串。 但是,当我试图发送更多行其开车撞为什么我的Java服务器关闭套接字?

java.net.SocketException: Socket is closed at java.net.Socket.getOutputStream(Unknown Source) at server.ServerCore.hiMsg(ServerCore.java:67) at server.ServerCore.run(ServerCore.java:49)

这里是我的服务器代码:

package server; 

import java.io.File; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.*; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author pisio 
*/ 
public class ServerCore extends Thread { 

    private LoadSettings loadSettings = LoadSettings.Init(); 
    private int port = loadSettings.getConfigInt("port"); 
    private int max_connections = loadSettings.getConfigInt("max_connections"); 
    private String ipServer = loadSettings.getConfig("ipServer"); 
    private ServerSocket socket; 
    private Socket connection; 
    private boolean serverRuning = false; 
    private int connectedUsers = 0; 
    private Vector connVector = new Vector(); 

    @Override 
    public void run() { 

     try { 
      socket = new ServerSocket(port, max_connections); 
      System.out.println("+++\t Server was started at address:" + socket.getLocalSocketAddress() + " with posible max users " + max_connections); 

      serverRuning = true; 

      while (serverRuning) { 
       if (connectedUsers <= max_connections) { 
        connection = socket.accept(); 
        connection.setKeepAlive(serverRuning); 
        connVector.add(connection); 
        connectedUsers = connVector.size(); 
        hiMsg(); 
        hiMsg(); 
        hiMsg(); 

       } 

       System.out.println("+++\t Last User:" + connVector.get(connVector.size() - 1).toString()); 
      } 


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

    public void hiMsg() { 

     try { 
      Socket c = (Socket) connVector.get(connVector.size() - 1); 
      PrintWriter out = new PrintWriter(new OutputStreamWriter(c.getOutputStream())); 
      out.write("Hi user ! Im server ! Your master ! Blow me down\nping: ? PONG ?"); 
      out.close(); 

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

    public void stopServer() { 
     statusServer(); 
     serverRuning = false; 
     try { 
      socket.close(); 
     } catch (IOException ex) { 
      //Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("+++++\t SERVER WAS STOPED !"); 
     // System.exit(port); 

    } 

    public void statusServer() { 
     if (serverRuning) { 
      System.out.println("Server running at port:" + port + " with connected users :" + connectedUsers + "/" + max_connections); 
     } else { 
      System.out.println("Server IS NOT RUNNING!"); 
     } 
    } 
} 

这里是我的客户端代码:

package meetingsclient; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.lang.String; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class ServerConnect { 

    private static ServerConnect sc = null; 
    private Socket socket = null; 

    private ServerConnect() { 

     try { 
      socket = new Socket("localhost", 8080); 

      sendHiMsg(); 

     } catch (Exception ex) { 
      Logger.getLogger(ServerConnect.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    private void sendHiMsg() throws IOException { 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


     System.out.println("Input:" + in.readLine()); 


    } 

    public static ServerConnect Init() { 
     if (sc == null) { 
      sc = new ServerConnect(); 
     } 
     return ServerConnect.sc; 
    } 
} 

我参考了这个主题:Socket Exception: socket is closed但这个dotn帮助了我。 //抱歉的链接,但我不明白如何正确格式化我的代码在这里。

+5

请勿使用pastebin。直接在您的问题中发布您的代码的相关部分。如果您觉得需要使用pastebin,那么这就清楚地表明您正试图发布更多可能需要并应该使用的代码。 – 2013-04-06 22:50:28

+0

我不能在这里格式化我的代码。没有工作。我认为这不是一个大问题。下次我会尝试将其粘贴到此处。 – 2013-04-06 22:57:52

+2

您确定可以在此格式化您的代码。实际上,您的代码会自动为您格式化。你可以在这里浏览一下,看看大多数问题(和答案)都包含格式器代码示例。检查此:http://stackoverflow.com/editing-help – 2013-04-06 22:58:48

回答

3

javadoc of getOutputStream() in Socket

关闭返回的OutputStream将关闭关联套接字。

另外,关闭PrintWriter(以及所有其他打印机/作家)也会关闭它们的基础流。因此,您通过关闭PrintWriter(在hiMsg()),然后尝试写入已关闭的套接字来关闭OutputStream

要解决此问题,请不要关闭PrintWriter。垃圾收集将为您照顾它!但是,当你完成它时请关闭套接字。

+0

如果我删除'out.close();'它不会将信息发送到客户端。 – 2013-04-06 23:27:16

+0

这不就是重点吗?如果你的意思是它不发送它 - 然后尝试'out.flush();'而不是,这将确保它刷新(发送)! – ddmps 2013-04-06 23:29:04

+0

非常感谢!我将重建我的矢量从此逃脱关闭PrintWriter – 2013-04-06 23:38:21

相关问题