Java Multiplayer Board Game - BufferedReader, кажется, застрянет, когда клиент 2 отправляет сообщениеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java Multiplayer Board Game - BufferedReader, кажется, застрянет, когда клиент 2 отправляет сообщение

Сообщение Anonymous »

Игра начинается автоматически, когда 2 клиента присоединятся к серверу, затем сервер ожидает, что клиент 1 даст ввод, а затем изменяется поворот.
В клиенте 2 сервер снова входит в состояние ожидания, но это Время, когда клиент отправляет ход, сервер, кажется, не получает вход.private ServerSocket socket;
private ServerTUI view;
private ServerLogic serverLogic;
private int readyCounter;
private final List clients = new ArrayList();
private boolean madeMove = false;
private int next_client_no;

public Server() {
view = new ServerTUI();
next_client_no = 1;
readyCounter=0;
}

public void run() {
boolean openNewSocket = true;
while (openNewSocket) {
try {
setup();

while (true) {
Socket sock = socket.accept();
ClientHandler handler = new ClientHandler(sock, this);
synchronized (clients) {
clients.add(handler);
}
new Thread(handler).start();
String name = "Client " + String.format("%02d", next_client_no++);
view.showMessage("New client [" + name + "] connected!");
}
} catch (Exception e) {
openNewSocket = false;
}
}

public synchronized void playGame() throws ServerUnavailableException, IOException {
Player current = null;
while (!serverLogic.isGameOver(serverLogic.getPlayers().get(serverLogic.getCurrentPlayer()).getRack())) {
madeMove = false;
current = serverLogic.getPlayers().get(serverLogic.getCurrentPlayer());
getServerLogic().setCopyRack(current.getRack());
getServerLogic().setCopyBoard(getServerLogic().getBoard());
//wait for input
while (!madeMove) {
}
}
changeTurn();
}
}
< /code>
Серверная сторона ClientHandler < /p>
public class ClientHandler implements Runnable{
private BufferedReader in;
private BufferedWriter out;
private Socket sock;
private Player player;
private Server srv;
private String name;

public ClientHandler(Socket sock, Server srv){
try {
this.sock = sock;
this.srv = srv;
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
} catch (IOException e) {
shutdown();
}
}
public void run() {
try {
String msg;

while ((msg = in.readLine()) != null) { // it seems to get stuck here
handleCommand(msg); //sendMessage from here
}
shutdown();
} catch (IOException | ServerUnavailableException e) {
shutdown();
}
}
public synchronized void sendMessage(String message) throws ServerUnavailableException {
if (out != null) {
try {
out.write(message);
out.newLine();
out.flush();
} catch (IOException e) {
throw new ServerUnavailableException("Could not send message to client: " + e.getMessage());
}
}
}

< /code>
Клиентская сторона < /p>
public class Client implements Runnable {
@Override
public void run() {
try {
String command;
while (serverSock.isConnected()) {
command = in.readLine();
processCommand(command);
}
} catch (IOException | ProtocolException e) {
throw new RuntimeException(e);
}
}
public void startClient() {
startConnection();
}

public void startConnection() {
// To be implemented
boolean connected = false;
while (!connected) {
try {
createConnection();
name = view.getString("Please enter name");
if (Protocol.isValidName(name)) {
handleHello();
} else {
System.out.println("Please enter valid name");
break;
}
connected = true;
Thread listenerThread = new Thread(this);
listenerThread.start();
} catch (ExitProgram e) {
view.showMessage("Exiting the program...");
break;
} catch (ServerUnavailableException e) {
view.showMessage("Connection failed: " + e.getMessage());
if (!view.getBoolean("Do you want to try again?")) {
break;
}
} catch (ProtocolException e) {
throw new RuntimeException(e);
}
}
}

public synchronized void sendMessage(String msg)
throws ServerUnavailableException {
if (out != null) {
try {
out.write(msg);
out.newLine();
out.flush();
} catch (IOException e) {
view.showMessage(e.getMessage());
throw new ServerUnavailableException("Could not write " + msg + "to server.");
}
} else {
throw new ServerUnavailableException("Could not write " + msg
+ "to server.");
}
}

< /code>
Пробовал отладки на каждом шаге, но с потоками и двумя разными клиентами иногда это давало странное поведение, пытался получить один отдельный класс для всего общения (sendmessage),
много пробовал Различные подходы в последние несколько дней, ведущих к одному и тому же месту.

Подробнее здесь: https://stackoverflow.com/questions/794 ... lient-2-se
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»