Я хочу интегрировать сервер с несколькими клиентами для игры в блэкджек, которую я создал, и поэтому начал практиковать с серверами в 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;
}
}
Любые предложения по правок, чтобы сделать свой код выполнять правильно и последовательно будет вэй приехать. Благодарю.
Вы не должны создавать свой ServerSocket * до * петля в то время как? –
Я принял ваш совет и перенес инициализацию серверного сокета вне цикла while. Однако сервер возвращается несовместимо (иногда он выводит правильные данные, а иногда и не подключается) –
Что вы ожидаете от вывода и что вы на самом деле видите в качестве вывода? –