Простой калькулятор с использованием TCP в Java

Опубликовано: 15 Февраля, 2022

Предварительные требования: Программирование сокетов на Java
Сеть просто не заканчивается односторонней связью между клиентом и сервером. Например, рассмотрим сервер, сообщающий время, который слушает запросы клиентов и отвечает клиенту с текущим временем. Приложения реального времени обычно используют модель «запрос-ответ» для связи.

Клиент обычно отправляет объект запроса на сервер, который после обработки запроса отправляет ответ обратно клиенту. Проще говоря, клиент запрашивает определенный ресурс, доступный на сервере, и сервер отвечает этому ресурсу, если он может проверить запрос. Например, когда вводится нажатие после ввода желаемого URL-адреса, запрос отправляется на соответствующий сервер, который затем отвечает, отправляя ответ в форме веб-страницы, которую браузеры могут отображать.
В этой статье реализовано простое приложение-калькулятор, в котором клиент будет отправлять запросы на сервер в форме простых арифметических уравнений, а сервер ответит ответом на уравнение.

Клиентское программирование

Шаги, выполняемые на стороне клиента, следующие:

  1. Откройте соединение сокета
  2. Коммуникация: В части коммуникации есть небольшое изменение. Отличие от предыдущей статьи заключается в использовании как входного, так и выходного потоков для отправки уравнений и получения результатов на сервер и от сервера соответственно. DataInputStream и DataOutputStream используются вместо базовых InputStream и OutputStream, чтобы сделать их машинно-независимыми. Используются следующие конструкторы -
    • общедоступный DataInputStream (InputStream в)
       Синтаксис: public DataInputStream (InputStream in)
      Параметры:
      in - базовый InputStream.
      Создает DataInputStream, который использует указанный базовый InputStream.
    • общедоступный DataOutputStream (InputStream в)
       Синтаксис: public DataOutputStream (OutputStream out)
      Параметры:
      out - лежащий в основе OutputStream.
      Создает DataOutputStream, который использует указанный базовый OutputStream.

    После создания входных и выходных потоков мы используем readUTF и writeUTF методов созданных потоков для получения и отправки сообщения соответственно.

    • общедоступная финальная строка readUTF ()
      выбрасывает IOException
       Читает строку, закодированную в кодировке UTF8.
      Броски:
      IOException - поток был закрыт и содержащийся входной поток 
      не поддерживает чтение после закрытия,
      или возникает другая ошибка ввода-вывода
      
    • общедоступная конечная строка writeUTF ()
      выбрасывает IOException
       Записывает строку, закодированную с использованием кодировки UTF8.
      Броски:
      IOException - поток был закрыт и содержащийся входной поток 
      не поддерживает чтение после закрытия,
      или возникает другая ошибка ввода-вывода
      
  3. Закрытие соединения.

Client Side Implementation

// Java program to illustrate Client Side Programming
// for Simple Calculator using TCP
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
  
public class Calc_Client
{
    public static void main(String[] args) throws IOException
    {
        InetAddress ip = InetAddress.getLocalHost();
        int port = 4444;
        Scanner sc = new Scanner(System.in);
  
        // Step 1: Open the socket connection.
        Socket s = new Socket(ip, port);
  
        // Step 2: Communication-get the input and output stream
        DataInputStream dis = new DataInputStream(s.getInputStream());
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
  
        while (true)
        {
            // Enter the equation in the form-
            // "operand1 operation operand2"
            System.out.print("Enter the equation in the form: ");
            System.out.println(""operand operator operand"");
  
            String inp = sc.nextLine();
  
            if (inp.equals("bye"))
                break;
  
            // send the equation to server
            dos.writeUTF(inp);
  
            // wait till request is processed and sent back to client
            String ans = dis.readUTF();
            System.out.println("Answer=" + ans);
        }
    }
}

Выход

Введите уравнение в форме: «операнд, оператор, операнд».
5 * 6
Ответ = 30
Введите уравнение в форме: «операнд, оператор, операнд».
5 + 6
Ответ = 11
Введите уравнение в форме: «операнд, оператор, операнд».
9/3
Ответ = 3

Серверное программирование

Действия, выполняемые на стороне сервера, следующие:

  1. Установите соединение через сокет.
  2. Обработка уравнений, поступающих от клиента: на стороне сервера мы также открываем как inputStream, так и outputStream. После получения уравнения мы обрабатываем его и возвращаем результат клиенту, записывая его в outputStream сокета.
  3. Закройте соединение.

Server Side Implementation

// Java program to illustrate Server Side Programming
// for Simple Calculator using TCP
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
  
public class Calc_Server
{
    public static void main(String args[]) throws IOException
    {
  
        // Step 1: Establish the socket connection.
        ServerSocket ss = new ServerSocket(4444);
        Socket s = ss.accept();
  
        // Step 2: Processing the request.
        DataInputStream dis = new DataInputStream(s.getInputStream());
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
  
        while (true)
        {
            // wait for input
            String input = dis.readUTF();
  
            if(input.equals("bye"))
                break;
  
            System.out.println("Equation received:-" + input);
            int result;
  
            // Use StringTokenizer to break the equation into operand and
            // operation
            StringTokenizer st = new StringTokenizer(input);
  
            int oprnd1 = Integer.parseInt(st.nextToken());
            String operation = st.nextToken();
            int oprnd2 = Integer.parseInt(st.nextToken());
  
            // perform the required operation.
            if (operation.equals("+"))
            {
                result = oprnd1 + oprnd2;
            }
  
            else if (operation.equals("-"))
            {
                result = oprnd1 - oprnd2;
            }
            else if (operation.equals("*"))
            {
                result = oprnd1 * oprnd2;
            }
            else
            {
                result = oprnd1 / oprnd2;
            }
            System.out.println("Sending the result...");
  
            // send the result back to the client.
            dos.writeUTF(Integer.toString(result));
        }
    }
}

Выход:

Полученное уравнение: -5 * 6
Отправка результата ...
Полученное уравнение: -5 + 6
Отправка результата ...
Полученное уравнение: -9 / 3
Отправка результата ...

Примечание. Чтобы протестировать указанные выше программы в системе, убедитесь, что вы запускаете сначала серверную программу, а затем клиентскую. Убедитесь, что вы находитесь в клиентской консоли и оттуда введите уравнение в формате «операнд1, оператор, операнд2» и нажмите Enter. Ответ на запрошенное уравнение будет показан только в клиентской консоли. Наконец, чтобы завершить общение, введите «пока» (без кавычек) и нажмите Enter.

Связанная статья:
Простой калькулятор с использованием UDP в Java

Эта статья предоставлена Ришабом Марси . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .