2013-04-06 2 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, но эта точка помогла мне. // Извините за ссылки, но я не могу понять, как правильно отформатировать мой код здесь.

+5

Не использовать пастебин. Отправьте только соответствующую часть своего кода прямо в свой вопрос. Если вы чувствуете необходимость использовать пастебин, это явное указание на то, что вы пытаетесь отправить больше кода, который вам, вероятно, нужен и должен. –

+0

Я не могу форматировать свой код здесь. Не работает. Я думаю, что это не большая проблема. В следующий раз я попытаюсь вставить его здесь. –

+2

Вы можете отформатировать свой код здесь. Фактически, ваш код автоматически отформатирован для вас. Вы можете немного передвигаться здесь, чтобы увидеть, что большинство вопросов (и ответов) содержат образцы кода форматирования. Проверьте это: http://stackoverflow.com/editing-help –

ответ

3

От javadoc of getOutputStream() in Socket:

Закрытие возвращаемый OutputStream закроет связанный сокет.

Кроме того, закрытие PrintWriter (и всех других принтеров/писателей) также закрывает их основные потоки. Итак, вы закрываете OutputStream, закрывая PrintWriterhiMsg()), а затем пытаетесь записать в сокет, который был закрыт.

Чтобы устранить проблему, не закрывайте PrintWriter. Сбор мусора позаботится об этом для вас! Но закрывайте розетку, когда вы закончите с ней.

+0

Если я удалю 'out.close();' он не отправляет информацию клиенту. –

+0

Разве это не так? Если вы имеете в виду, что он его не отправляет, попробуйте вместо этого использовать 'out.flush();', что гарантирует его сброс (отправляет)! – ddmps

+0

Спасибо большое! Я восстановил свой вектор, чтобы убежать от этого, чтобы закрыть PrintWriter. –

Смежные вопросы