Java UDP简单计算器

Java UDP简单计算器

互联网协议套件包含各种协议,使得设备之间可以在互联网上进行通信。UDP是该套件的其中一个协议,其全称为用户数据报协议。与TCP不同,UDP不可靠,也是一种无连接协议。它在发送数据之前不会建立与其他设备的任何连接。

在本文中,我们将使用Java中的UDP开发一个简单的客户端-服务器计算器。客户端将请求运算,服务器会在计算完成后将结果发送给客户端设备。

Java网络编程

首先让我们简单了解一下Java网络编程的一些基本概念。

InetAddress

IP地址是一个32位或128位无符号数字,唯一标识互联网上的设备。用名称而不是数字地址来记住IP主机的名字更容易记住。因此,我们需要使用”InetAddress”类对其进行封装。我们使用其内置的”getLocalHost()”方法来获取本地主机的IP地址。

Datagrams

Datagrams是小型数据包,其中包含可以在互联网上的两个机器之间传递的数据。Java实现了两个类来建立UDP连接:

DatagramSocket 类用于发送和接收数据报包。它还确定这些包的目的地。其内置方法 “send()”“receive()” 分别用于发送和接收数据包。

语法

DatagramSocket nameOfObject = new DatagramSocket();

DatagramPacket 类的对象用于存储要发送的数据。

语法

DatagramPacket nameOfPacket = new DatagramPacket();

使用UDP的计算器程序

客户端程序

代码的工作原理

  • 我们首先导入两个最重要的包,分别是 java.net’ 以访问与Java网络相关的所有类,和 java.io’ 用于输入和输出流。这里还使用了 ‘java.util’ 包来使用’Scanner’类。

  • 建立一个UDP连接,然后获取本地主机地址。

  • 现在,在try块中,我们将通过’Send()’和’Receive()’方法(使用’DatagramSocket’类)要求用户输入并相应地接收结果。

import java.io.*;
import java.net.*;
import java.util.*;
public class ClientCalc {
   public static void main(String args[]) throws IOException {
      Scanner inp = new Scanner(System.in);
      // making UDP connection
      DatagramSocket datagsokt = new DatagramSocket();   
      // fetching the localhost address
      InetAddress addr = InetAddress.getLocalHost();
      byte strm[] = null;
      try {
         while (true) {
            System.out.println("Type 1 for Addition");
            System.out.println("Type 2 for Subtraction");
            System.out.println("Type 3 for Multiplication");
            System.out.println("Type 4 for Division");
            System.out.println("Enter your choice: ");
            String oprtr = inp.nextLine();
            // to convert the user choice to byte
            strm = new byte[256];
            strm = oprtr.getBytes();
            // creating datagram packet to send to server
            DatagramPacket packtsend = new DatagramPacket(strm, strm.length, addr, 6666);
            datagsokt.send(packtsend);
            // Type 0 for cut the connection
            if (oprtr.equals("0")) {
               break;
            }
            // to receive the result from server
            strm = new byte[256];
            DatagramPacket packtrec = new DatagramPacket(strm,   strm.length);
            datagsokt.receive(packtrec);
            // display the result 
            System.out.println("Your Result for the given operation = " + new String(strm, 0, strm.length));
         }
      }
      // to handle exception
      catch(Exception exp) {
         System.out.println(exp);
      } 
   }
}

服务器端程序

代码的工作原理

  • 首先,与客户端建立连接,并定义两个DatagramPacket类的对象,使用DatagramSocket类的”send()”和”receive()”方法发送和接收数据包。

  • 在try块内,我们接收来自客户端的请求,然后使用switch case进行操作,并将结果发送到客户端设备。

示例

import java.io.*;
import java.net.*;
class ServerCalc {
   public static void main(String[] args) throws IOException {
      // making connection to client
      DatagramSocket datagsokt = new DatagramSocket(6666);
      byte[] strm = null;
      DatagramPacket packtrec = null;
      DatagramPacket packtsend = null;
      try {
         while (true) {
            strm = new byte[256];
            // to receive the packet from client
            packtrec = new DatagramPacket(strm, strm.length);
            datagsokt.receive(packtrec);
            String oprtr = new String(strm, 0, strm.length);
            System.out.println("Client has requested for " + oprtr );
            int data1 = 15;
            int data2 = 5;
            int tot = 0;
            char opt = oprtr.charAt(0); 
            switch(opt) {
               case '1' : 
                  tot = data1 + data2;
               break;
               case '2' :
                  tot = data1 - data2;  
               break;
               case '3' :
                  tot = data1 * data2;
               break;
               case '4' :
                  tot = data1 / data2;  
               break;
               default :
               break; 
            }
            // Converting the string result to integer 
            String res = Integer.toString(tot);
            // converting the integer to bytes
            strm = res.getBytes();
            int port = packtrec.getPort(); 
            // getting port number
            // sending final result in the form of datagram packet
            packtsend = new DatagramPacket(strm, strm.length, InetAddress.getLocalHost(), port);
            datagsokt.send(packtsend);
         }
      }
      // to handle exception
      catch(Exception exp) {
         System.out.println(exp);
      } 
   }
}

同时在本地机器上打开两个cmd窗口,来运行这两个程序。在第一个cmd窗口界面上,编译并运行服务器端程序,并在另一个窗口中执行客户端程序。

客户端输出结果

D:\Java Programs>java ClientCalc
Type 1 for Addition
Type 2 for Subtraction
Type 3 for Multiplication
Type 4 for Division
Enter your choice:
1
Your Result for the given operation = 20

服务器端的输出

D:\Java Programs>java ServerCalc
Client has requested for 1

当我们输入0时,连接将被终止,程序将停止执行。

结论

在本文中,我们学习了Java网络编程的一些基本概念。此外,我们还讨论了使用UDP的简单计算器的服务器端和客户端程序。我们发现了如何在Java中建立客户端和服务器设备之间的连接。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程