Java Legacy Socket API

Java Legacy Socket API

Unix操作系统的Legacy Socket API提供了一组用于网络通信的编程接口。尽管现代化网络API的出现,但它在过去三十多年中得到了广泛的使用,并且至今仍在使用。

应用程序可以通过API构建套接字并在网络上通信,API由一组函数组成。套接字是一种软件端点,用于在程序之间进行网络通信。API提供了两种类型的套接字:面向连接的套接字和无连接的套接字。

实现

根据这个JEP,一个新的NioSocketImpl实现将取代SocketImpl实现。通过利用与NIO(新IO)实现相同的架构并与当前的缓冲区缓存技术集成,这种方法消除了对线程堆栈的需求。随这些调整一起的还有一些其他有用的调整,包括java.lang.ref。如果对于SocketImpl实现这样的套接字进行垃圾收集,而这些套接字尚未关闭,并且在轮询Socket时以非阻塞模式发生超时动作,将使用一种更清理的方法来关闭套接字。

为了减少在重新实现已经使用了20多年的方法时可能出现的问题,已经开发了一个系统属性来使用原始实现。

当指定usePlainSocketImpl=true时,将采用上述实现。

应强调的是SocketImpl是一种历史上的SPI方法,过去它并没有完全陈述;当前版本尽可能模拟未定义的行为。然而,新方法可能会出现一些边缘情况失败,如此处所示。上面的系统特性可用于解决所有这些问题,除了两个。FileInputStream和FileOutputStream的早期实现返回的是输入流和输出流,然后进行扩展。

在当前的实现中,这种情况不再成立。使用自定义或平台SocketImpl的ServerSocket无法接受返回具有其他类型SocketImpl的套接字的连接。

步骤

  • 首先步骤是实例化Socket对象,其中包含你打算连接到的主机名和端口号的详细信息。

  • 与服务器进行对话需要从上述建立的套接字对象中创建输入和输出流,这些流封装了传输过程中所需的所有必要数据。

  • 完成后关闭套接字和流。

API实现与响应生成

示例

import java.net.*;
import java.io.*;

public class SocketExample {
   public static void main(String[] args) {
      try {
         // Create a socket
         Socket socket = new Socket("localhost", 8080);

         // Send a message to the server
         OutputStream output = socket.getOutputStream();
         PrintWriter writer = new PrintWriter(output, true);
         writer.println("Hello, server!");

         // Receive a message from the server
         InputStream input = socket.getInputStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(input));
         String response = reader.readLine();
         System.out.println("Server response: " + response);

         // Close the socket
         socket.close();
      } catch (UnknownHostException ex) {
         System.out.println("Server not found: " + ex.getMessage());
      } catch (IOException ex) {
         System.out.println("I/O error: " + ex.getMessage());
      }
   }
}

输出

Java Legacy Socket API

生成的结果可能因产生的异常类型而有所不同,这可能是由于无响应的服务器或通信故障引起的。例如,如果无法定位服务器,则生成的输出将为:

Java Legacy Socket API

这个相关的示例首先要求我们作为客户端远程连接到本地操作的TCP/IP(传输控制协议/互联网协议)身份验证网络服务,该服务在端口号’8080’上启用。在确保最佳连接后,我们将继续托管优化的“请求”型服务,并在需要时正确管理协议/程序特定错误,同时优先处理在两个对等主机/客户系统界面连接安排完成之前执行的成功交换倾向/行动后适当管理“会话”关闭过程。一旦完成,将相应终止之前与其他网络节点的关联源,通过关闭所有合法的通信渠道来恢复系统资源为其预先存在的默认值。

优点和缺点

  • 多亏了几个关键的改进,相比之前的版本,Java Socket API的维护变得更加简单,以前的版本存在许多挑战。这应该会提高套接字代码的可靠性。

  • 由于NIO在更低的级别上运作,我们不需要对当前的Socket和ServerSocket类做任何修改-这些好处非常明显!通过这些旨在简化维护流程并确保未来持续可行性的改进,Java套接字编程的未来看起来非常令人鼓舞,正如在JDK中正在开发的Project Loom所展示的那样。

  • 该项目探索了纤程(fibers)的概念,这是对线程的全新视角(在我们之前的帖子中了解有关Project Loom的更多内容)。一旦Project Loom发布,NIO实现将能够受益,而早期的实现将无效。这是因为NIO实现使用了java.util.concurrent锁,而不是同步方法。

  • 虽然无连接套接字用于不可靠的面向数据报的通信,而连接导向套接字用于可靠的面向流的通信。

  • 由于API的底层性质,开发人员必须手动处理许多细节,包括数据包的分割和重组。虽然这可能很困难,但它也给了开发人员更多的自由和控制。

  • 值得注意的是,许多公认的编程语言(包括但不限于-CC++和Python)已经在其环境中非常重视实现了非常有用的传统套接字API。虽然最近的网络技术,如gRPC或WebSocket,可能因其增加的效率/抽象级别而掩盖-传统套接字API仍然有价值,因为它具有灵活性、自然的学习曲线,并通过已经部署在线和在广泛的行业中广泛使用的应用程序融入到今天的市场中。

结论

对于基于Unix的系统的网络连接,传统套接字API是一个广受喜爱的编程接口集合,已经存在了三十多年。开发人员可以借助这个由一系列函数组成的API构建套接字并在网络上进行通信。该API提供了两种类型的套接字:面向连接的套接字和无连接的套接字,分别提供可靠和不稳定的通信。

传统套接字API给开发人员提供了更多的自由和控制,但它也是一种相当底层的API,需要手动处理许多细节。尽管存在更现代的网络API的创建,但传统套接字API仍然很有用,因为它易于使用、灵活,并在诸如C、C++和Python等多种编程语言中广泛使用。

在我们的示例中,我们展示了如何使用Java传统套接字API构建套接字、发送和接收数据,并处理异常。这些程序的输出将由服务器的响应或引发的异常决定,如前面的响应所述。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程