Skip to content
This repository has been archived by the owner on Sep 9, 2021. It is now read-only.

Ворошилов Алексей /70203 lab3c (12-auction) #131

Conversation

alekseivoroshilov
Copy link

@alekseivoroshilov alekseivoroshilov commented Feb 24, 2021

Лабораторная работа №3, Вариант 12 Система торгов

Java 15.0.2
Maven 4.0.0

Описание

UDP-запросы. Клиент может зарегистрироваться и иметь только одну из двух ролей: (BUYER/SELLER). Сделано это для соответствия разработанному напарником сервисом:

Команда запуска:
java -jar lab3client.jar

Описание используемого протокола.

Клиентское приложение должно реализовывать следующие функции:

  1. Установление соединения с сервером;
public void connect() throws IOException {
        String ipAddress = null;
        String port = null;
        while (!connected) {
            System.out.println("Enter ip address");
            ipAddress = br.readLine();
            System.out.println("Enter port");
            port = br.readLine();
            try {
                socket = new Socket(ipAddress, Integer.parseInt(port));
                connected = true;
            } catch (IOException e) {
                System.out.println("Couldn't connect");
                connected = false;
            }
        }
  1. Регистрация в качестве распорядителя или участника;
    private void signin(String username, Role role) {
        JSONObject signinPacket = new JSONObject(packets.getJSONObject("signinRequest"));
        this.username = username;
        this.role = role;
        signinPacket.put("username", username);
        signinPacket.put("buyer", role.equals(Role.BUYER));
        signinPacket.put("opcode", 0);
        sendPacket(signinPacket.toString());
    }
  1. Участник: передача запроса о выводе списка лотов;
private void lotList() {
        JSONObject packet = new JSONObject(packets.getJSONObject("lotListRequest"));
        packet.put("opcode", 2);
        sendPacket(packet.toString());
    }
  1. Участник: передача запроса о повышении стоимости лота;

private void raiseBid(String lotId, int bid){
        JSONObject packet = new JSONObject(packets.getJSONObject("raiseBidRequest"));
        packet.put("lotId", lotId);
        packet.put("bid", bid);
        packet.put("opcode", 4);
        sendPacket(packet.toString());
    }
  1. Распорядитель: передача запроса о добавлении лота;
private void newLot(String name, int bid) {
        JSONObject packet = new JSONObject(packets.getJSONObject("newLotRequest"));
        packet.put("lotName", name);
        packet.put("lotInitialPrice", bid);
        packet.put("opcode", 6);
        sendPacket(packet.toString());
    }
  1. Распорядитель: передача запроса о прекращении торгов;
private void endTrade(String id) {
        JSONObject packet = new JSONObject(packets.getJSONObject("endTradeRequest"));
        packet.put("lotId", id);
        packet.put("opcode", 8);
        sendPacket(packet.toString());
    }
  1. Получение результатов торгов от сервера;
case 9: { //end trade results
    System.out.println(serverReply.get("Trade has ended. Result:"));
    System.out.println("\tLot ID: " + serverReply.get("lotId"));
    System.out.println("\tLot name: " + serverReply.get("lotName"));
    System.out.println("\tOwner: " + serverReply.get("lotOwner"));
    System.out.println("\tWon with the highest bid: " + serverReply.get("highestBid"));
    break;
}
  1. Разрыв соединения;
                        case "quit": {
                            quit();
                            connected = false;
                            synchronized (socket) {
                                socket.notify();
                            }
                            break;
                        }
  1. Обработка ситуации отключения клиента сервером.
                    if(opcode == 10) { //disconnect
                        System.out.println("Server disconnected you from session");
                        connected = false;
                        loggedIn = false;
                        synchronized (socket) {
                            socket.notify();
                        }
                    }

В приложении клиента работают две нити:
1-я считывает вводимые команды клиента и отправляет соответствующие пакеты серверу
2-я "слушающая" нить, которая получает пакеты от сервера и выводит информацию о них на экран.
Реализация была мотивирована тем, что клиенту могут приходить запросы от пользователей, либо сообщение сервера об отключении клиента в любой момент. Данные пакеты должны обрабатываться сразу же.

@alekseivoroshilov alekseivoroshilov changed the title Ворошилов /70203 lab3c (12-auction) Ворошилов Алексей /70203 lab3c (12-auction) Feb 24, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Зачтено Третья лабораторная Задания из методички
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants