2013-04-06 146 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

相關問題