2016-03-08 2 views
0

Я хочу интегрировать сервер с несколькими клиентами для игры в блэкджек, которую я создал, и поэтому начал практиковать с серверами в Java. Я создаю поток, который при запуске заставляет сервер прослушивать ввод и выводить результат. Затем я добавил функцию, чтобы остановить сервер. Однако сервер случайным образом производит правильный вывод, а иногда и не может подключиться. Вот код, когда пользователь принимает сервер:Java Server, производящий противоречивый вывод

st = new ServerThread(); //this is a field of type ServerThread 
st.start(); //this runs the server concurrently as a new thread 

Вот код, когда они закрывают сервера:

st.stopThread(); 

Наконец, здесь есть источник для serverThread:

public class ServerThread extends Thread { 

private volatile boolean isRunning = true; 
private Socket socket; 
private static final int PORTNUM = 1342; 

@Override 
public void run() { 
    while (isRunning) { //should run only when the 
     try { 
      ServerSocket serverSocket = new ServerSocket(PORTNUM); //uses the same port number, which I made a constant 
      //Reading the an object of type Information from the client 
      socket = serverSocket.accept(); 
      ObjectInputStream serverInputStream = new ObjectInputStream(socket.getInputStream()); 
      ObjectOutputStream serverOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
      Information i = (Information) serverInputStream.readObject(); 
      //arbitrarily changes the data stored in the information object to verify connection with server 
      i.setI(100); 
      i.setS("new string"); 
      i.setD(4.4); 
      //sends the modified object back to the client 
      serverOutputStream.writeObject(i); 
      serverInputStream.close(); 
      serverOutputStream.close(); 
      socket.close(); 
     } catch (IOException e) { 
      //System.out.println("IOException"); 
      //e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      //System.out.println("ClassNotFoundException"); 
      //e.printStackTrace(); 
     } finally { 
      try { 
       if (socket != null) { //avoid null pointer if no connections have been established 
        socket.close(); 
       } 
      } catch (IOException ex) { 
       //Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

} 

public void stopThread() { 
    isRunning = false; 
} 

}

Любые предложения по правок, чтобы сделать свой код выполнять правильно и последовательно будет вэй приехать. Благодарю.

+1

Вы не должны создавать свой ServerSocket * до * петля в то время как? –

+0

Я принял ваш совет и перенес инициализацию серверного сокета вне цикла while. Однако сервер возвращается несовместимо (иногда он выводит правильные данные, а иногда и не подключается) –

+0

Что вы ожидаете от вывода и что вы на самом деле видите в качестве вывода? –

ответ

0

Я переместила бы socket определение далеко от того, переменная экземпляра т.е.,

while (isRunning) { 
    Socket socket = null; 
    try { 
    ...