Игра начинается автоматически, когда 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
Java Multiplayer Board Game - BufferedReader, кажется, застрянет, когда клиент 2 отправляет сообщение ⇐ JAVA
Программисты JAVA общаются здесь
1738277607
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),
много пробовал Различные подходы в последние несколько дней, ведущих к одному и тому же месту.
Подробнее здесь: [url]https://stackoverflow.com/questions/79401421/java-multiplayer-board-game-bufferedreader-seems-to-get-stuck-when-client-2-se[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия