使用 Java 实现 TCP 简单计算器


互联网协议套件包含各种协议,这些协议使设备能够通过互联网进行通信。TCP 是此套件中最常见的协议。它是一种面向连接的协议,这意味着它在两个设备之间维持已建立的连接,直到通信结束。这就是在网络冲浪、发送电子邮件和传输文件时使用它的原因。

在本文中,我们将使用 Java 中的 TCP 开发一个简单的客户端-服务器端计算器。客户端将请求操作,服务器将在计算后将结果发送到客户端设备。

Java 网络

让我们首先简要了解一些关于 Java 网络的基本概念。

InetAddress

IP 地址是一个 32 位或 128 位无符号数字,用于唯一标识互联网上的设备。记住 IP 主机的名称比记住数字地址更容易。因此,我们需要使用“InetAddress”类将其封装起来。我们使用其内置方法“getLcalHost()”来检索 LocalHost 的 IP 地址。

Socket

它是 Java 网络概念的基础,它允许设备同时为多个客户端提供服务。有两种 TCP 套接字类。一个是“ServerSocket”类,用于接收并向客户端设备发送结果的服务器;另一个是“Socket”类,用于客户端请求信息。

I/O 流

流是在 Java 网络中执行输入和输出操作时使用的抽象。通过使用“getInputStream()”“getOutputStream()”,我们可以访问与“Socket”类关联的输入和输出流。

使用 TCP 的计算器程序

客户端程序

代码工作原理

  • 我们首先导入两个最重要的包,名为“java.net”以访问所有关于 Java 网络的类,以及“java.io”用于输入和输出流。“java.util”包用于使用“Scanner”类。

  • 获取 LocalHost 地址,然后将端口号和地址存储在“Socket”类的对象中。

  • 定义两个名为“inpStrm”的对象来接收数据,以及“outpStrm”的对象以流的形式发送数据。

  • 现在,在 try 块内部,我们将要求用户输入以请求操作并相应地接收结果。

示例

import java.io.*;
import java.net.*;
import java.util.*;
public class ClientCal {
   public static void main(String[] args) throws IOException {
      // fetching address of localhost
      InetAddress addr = InetAddress.getLocalHost();
      Scanner inp = new Scanner(System.in);
      // establishing socket connection
      Socket sock = new Socket(addr, 6666);
      // to send and receive data through streams
      DataInputStream inpStrm = new DataInputStream(sock.getInputStream());
      DataOutputStream outpStrm = new DataOutputStream(sock.getOutputStream());
      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: ");
            int oprtr = inp.nextInt();
            // Type 0 for cut the connection
            if (oprtr == 0) {
               break;
            }
            // sending the operator for operation
            outpStrm.writeInt(oprtr); 
            // reading result from server
            String res = inpStrm.readUTF();
            System.out.println("Your Result for the given operation = " + res);
         }
      }
      // to handle exception
      catch(Exception exp) {
         System.out.println(exp);
      } 
   }
}

服务器端程序

代码工作原理

  • 首先,与客户端建立连接。

  • 然后从客户端读取请求。

  • 在 try 块内部,使用 switch case 执行操作并将结果发送到客户端设备。

  • catch 块用于处理运行时期间的任何类型的异常。

示例

import java.io.*;
import java.net.*;
import java.util.*; 
public class ServeCalc {
   public static void main(String args[]) throws IOException {
      // establishing the socket connection
      ServerSocket Serve = new ServerSocket(6666);
      Socket sock = Serve.accept();
      // to send and receive data through streams
      DataInputStream inpStrm = new DataInputStream(sock.getInputStream());
      DataOutputStream outpStrm = new DataOutputStream(sock.getOutputStream());
      try {
         while (true) {
            // reading input from client
            int oprtr = inpStrm.readInt();
            System.out.println("Client has requested for " + oprtr + " operation");
            int res = 0;
            int data1 = 15;
            int data2 = 5;
            switch(oprtr) {
	            case 1 : 
	               res = data1 + data2;
                  outpStrm.writeUTF(Integer.toString(res));
		            break;
	            case 2 :
		            res = data1 - data2;
                  outpStrm.writeUTF(Integer.toString(res));
		            break;
	            case 3 :
		            res = data1 * data2;
                  outpStrm.writeUTF(Integer.toString(res));
		            break;
	            case 4 :
		            res = data1 / data2;
                  outpStrm.writeUTF(Integer.toString(res));
		            break;
	            default :
		         outpStrm.writeUTF(" You have given invalid choice! ");
		            break; 
            }
            System.out.println("Result sent to the client...");
         }
      }
      // to handle exception
      catch(Exception exp) {
         System.out.println(exp);
      } 
   }
}

要运行这两个程序,请在本地计算机上同时打开两个 cmd。在第一个 cmd 界面上,编译并运行服务器端程序,然后在另一个界面上执行客户端程序。

服务器端输出

D:\Java Programs>javac ServeCalc.java
D:\Java Programs>java ServeCalc
Client has requested for 1 operation
Result sent to the client...
Client has requested for 2 operation
Result sent to the client...
Client has requested for 3 operation
Result sent to the client...
Client has requested for 4 operation
Result sent to the client...
java.net.SocketException: Connection reset

客户端输出

D:\Java Programs>javac ClientCal.java 
D:\Java Programs>java ClientCal
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
Type 1 for Addition
Type 2 for Subtraction
Type 3 for Multiplication
Type 4 for Division
Enter your choice:
2
Your Result for the given operation = 10
Enter your choice:
0

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

结论

在本文中,我们学习了 Java 网络的一些基本概念。还讨论了使用传输控制协议的简单计算器的服务器端和客户端程序。我们了解了如何在 Java 中在客户端和服务器设备之间建立连接。

更新于: 2023年5月15日

767 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告