Непрерывное соединение Socket, ObjectInputStream EOF по второму запросуJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Непрерывное соединение Socket, ObjectInputStream EOF по второму запросу

Сообщение Anonymous »

Сокеты Java 21
позволяют использовать несколько соединений
с использованием ObjectInputStream и ObjectOutputStream создают EOF при втором запросе
У меня есть клиентская сторона, мостовой сервер (посредник) и сервер инвентаря.
  • Клиент – это конечные пользователи.
  • Сервер представляет собой систему авторизации и своего рода шлюз к Серверу инвентаризации
Диаграмма последовательности следующая:

Изображение

Теперь о проблеме:
  • Запуск BridgeServer
  • Запуск UserClient
    и проверяем, установлено ли соединение.
  • Отправка любого типа запроса
    (объекта) из опций, представленных в терминале.

    во время своих прогонов я отправил запрос AuthenticationRequest.
  • Запрос AuthenticationRequest обрабатывается правильно.
  • Повторно отправьте AuthenticationRequest или любой запрос.
  • Код: Выделить всё

    EOFException
    [/b] генерируется BridgeServer

Код: Выделить всё

java.io.EOFException
at java.base/java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2933)
at java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3428)
at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:985)
at java.base/java.io.ObjectInputStream.(ObjectInputStream.java:416)
at com.pe.distributed.system.bridge.BridgeServer.run(BridgeSide.java:44)
at com.pe.distributed.system.bridge.BridgeMain.main(BridgeMain.java:5)
Для контекста и воспроизводимости:
UseClient

Код: Выделить всё

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.Map;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public record AuthenticationRequest(String username, String password) implements Serializable {
}

public record InventoryQuery() implements Serializable {
}

public record ItemOrder(String itemCode, int quantity) implements Serializable {
}

public class UserClient {
private static final Logger logger = Logger.getLogger(UserClient.class.getName());
private static final String EXCEPTION_OCCURRED = "Exception occurred";

private UserClient() {
}

@SuppressWarnings("java:S2189")
public static void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
try (Socket bridgeSocket = new Socket("127.0.0.1", 5550)) {
logger.log(Level.INFO, "Connected successfully to bridge server");

while (true) {
displayMainMenu();
int choice = scanner.nextInt();
scanner.nextLine();

// Handle user choice
switch (choice) {
case 1:
authenticate(scanner, bridgeSocket);
break;
case 2:
checkInventory(bridgeSocket);
break;
case 3:
placeOrder(scanner, bridgeSocket);
break;
default:
logger.log(Level.WARNING, "Invalid choice. Please enter a valid option.");
}
}
} catch (IOException | ClassNotFoundException e) {
logger.log(Level.SEVERE, EXCEPTION_OCCURRED, e);
} finally {
scanner.close();
}
}
}

@SuppressWarnings("java:S106")
private static void displayMainMenu() {
System.out.println("What would you like to do:");
System.out.println("1. Authenticate");
System.out.println("2. Check Inventory");
System.out.println("3.  Place an Order");
System.out.print("Enter your choice: ");
}

@SuppressWarnings("java:S106")
private static void authenticate(Scanner scanner, Socket socket) throws IOException, ClassNotFoundException {
Map.Entry authCreds = getUserAuthenticationInput(scanner);
AuthenticationRequest authenticationRequest = new AuthenticationRequest(authCreds.getKey(),
authCreds.getValue());

ObjectOutputStream bridgeIn = new ObjectOutputStream(socket.getOutputStream());
bridgeIn.writeObject(authenticationRequest);
bridgeIn.flush();

ObjectInputStream bridgeOut = new ObjectInputStream(socket.getInputStream());
Object response = bridgeOut.readObject();
logger.log(Level.FINE, "Received response from bridge: {0}", response);
System.out.println(response);
}

@SuppressWarnings("java:S106")
private static Map.Entry getUserAuthenticationInput(Scanner scanner) {
System.out.println("Please provide credentials.\n");
System.out.print("Username: ");
String username = scanner.nextLine();
System.out.print("Password: ");
String password = scanner.nextLine();
return Map.entry(username, password);
}

@SuppressWarnings("java:S106")
private static void checkInventory(Socket socket) throws IOException, ClassNotFoundException {
ObjectOutputStream bridgeIn = new ObjectOutputStream(socket.getOutputStream());
bridgeIn.writeObject(new InventoryQuery());
bridgeIn.flush();

ObjectInputStream bridgeOut = new ObjectInputStream(socket.getInputStream());
Object response = bridgeOut.readObject();
logger.log(Level.FINE, "Received response from bridge: {0}", response);
System.out.println(response);
}

private static void placeOrder(Scanner scanner, Socket socket) throws IOException, ClassNotFoundException {
Map.Entry orderDetails = getUserOrderInput(scanner);
ItemOrder itemOrder = new ItemOrder(orderDetails.getKey(), orderDetails.getValue());

ObjectOutputStream bridgeIn = new ObjectOutputStream(socket.getOutputStream());
bridgeIn.writeObject(itemOrder);
bridgeIn.flush();

ObjectInputStream bridgeOut = new ObjectInputStream(socket.getInputStream());
Object response = bridgeOut.readObject();
logger.log(Level.FINE, "Received response from bridge: {0}", response);
}

@SuppressWarnings("java:S106")
private static Map.Entry getUserOrderInput(Scanner scanner) {
System.out.println("Place your order!\n");

String itemCode;
int desiredQuantity;

// Input validation loop for item code
do {
System.out.print("Item-code: ");
itemCode = scanner.nextLine();
} while (itemCode == null || itemCode.isEmpty());

// Input validation loop for quantity
do {
System.out.print("Quantity: ");
while (!scanner.hasNextInt()) {
System.out.println("Invalid input.  Please enter a valid number.");
scanner.next(); // Consume the invalid input
}
desiredQuantity = scanner.nextInt();
scanner.nextLine(); // Consume newline character
} while (desiredQuantity  как и ожидалось.

[*]Другие говорят, что объект(ы) ObjectInputStream и фактический InputStream Socket могут быть [b]не синхронизированы[/b].
[/list]
Возможно, я неправильно понял возможности сокетов,
но
[list]
[*]Я хочу, чтобы мой сервер поддерживал соединение до тех пор, пока клиент не закроет его.

[*]И чтобы все запросы обрабатывались корректно.
[/list]
И, конечно же, отсутствие EOFException  ошибки.
Будем рады отзывам! 

Подробнее здесь: [url]https://stackoverflow.com/questions/78480752/continuous-socket-connection-objectinputstream-eof-on-second-request[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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