Java.net详解

Java.net是Java平台提供的用于网络编程的API集合。它提供了在Java应用程序中实现网络连接和通信所需的基本组件和类。Java.net包含了一系列类,如Socket、ServerSocket、URL等,它们可以帮助我们实现网络编程。

一、Socket和ServerSocket

Socket类提供了一种机制,使得两个进程之间可以进行通信。通过Socket类,可以建立一个客户端到服务器的连接。当Socket连接建立后,客户端和服务器之间可以发送和接收数据。

ServerSocket类是另一种重要的类,它允许我们创建一个服务端应用程序。服务端应用程序等待客户端的请求,当有客户端发起请求后,服务端就可以通过Socket对象与客户端通信。下面是一个简单的使用Socket和ServerSocket实现通信的示例代码。

// 服务端程序
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
inputStream.read();
outputStream.write("Hello World".getBytes());
socket.close();
serverSocket.close();

// 客户端程序
Socket socket = new Socket("localhost", 8080);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
outputStream.write("Hello Server".getBytes());
inputStream.read();
socket.close();

二、URL和URLConnection

URL类表示一个统一资源定位器,在Java中,我们可以通过URL类来表示网络上的资源。URLConnection类可以通过URL来获取网络资源的输入流和输出流,也可以设置网络连接的各种属性。下面是一个简单的URL和URLConnection的实例代码。

URL url = new URL("http://www.baidu.com");
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}
bufferedReader.close();
inputStream.close();

三、DatagramSocket

DatagramSocket类提供了面向数据包的UDP协议的通信功能。它可以用于实现广播和多播等应用场景。下面是一个简单的使用DatagramSocket实现UDP通信的示例代码。

// 服务端程序
DatagramSocket serverSocket = new DatagramSocket(8080);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
serverSocket.receive(packet);
System.out.println(new String(packet.getData()));
serverSocket.close();

// 客户端程序
DatagramSocket clientSocket = new DatagramSocket();
byte[] buffer = "Hello Server".getBytes();
InetAddress inetAddress = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, inetAddress, 8080);
clientSocket.send(packet);
clientSocket.close();

四、HttpURLConnection

HttpURLConnection类是URLConnection的子类,它提供了HTTP协议的HTTP/1.1支持。它可以用于实现HTTP客户端,可以通过HTTP请求获取HTTP响应。下面是一个简单的使用HttpURLConnection实现HTTP通信的示例代码。

// 发起HTTP GET请求
URL url = new URL("http://www.baidu.com");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
StringBuilder responseBuilder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    responseBuilder.append(line);
}
urlConnection.disconnect();
reader.close();

// 发起HTTP POST请求
url = new URL("http://www.baidu.com");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream());
writer.write("Hello Server");
writer.flush();
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
responseBuilder = new StringBuilder();
while ((line = reader.readLine()) != null) {
    responseBuilder.append(line);
}
urlConnection.disconnect();
reader.close();
writer.close();

五、SocketChannel和ServerSocketChannel

Java.net提供了使用NIO实现非阻塞I/O的类SocketChannel和ServerSocketChannel。它们可以用于实现高并发的网络编程应用场景。下面是一个简单的使用SocketChannel和ServerSocketChannel实现非阻塞I/O的示例代码。

// 服务端程序
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
    int readyChannels = selector.select();
    if (readyChannels == 0) {
        continue;
    }
    Set selectorKeys = selector.selectedKeys();
    Iterator iterator = selectorKeys.iterator();
    while (iterator.hasNext()) {
        SelectionKey selectionKey = iterator.next();
        if (selectionKey.isAcceptable()) {
            SocketChannel socketChannel = serverSocketChannel.accept();
            socketChannel.configureBlocking(false);
            socketChannel.register(selector, SelectionKey.OP_READ);
        } else if (selectionKey.isReadable()) {
            SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            socketChannel.read(buffer);
            buffer.flip();
            socketChannel.write(buffer);
        }
        iterator.remove();
    }
}

// 客户端程序
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
socketChannel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.wrap("Hello Server".getBytes());
while (buffer.hasRemaining()) {
    socketChannel.write(buffer);
}
buffer.clear();
socketChannel.read(buffer);
socketChannel.close();

原创文章,作者:WZNSV,如若转载,请注明出处:https://www.506064.com/n/361561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
WZNSVWZNSV
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • 解决.net 6.0运行闪退的方法

    如果你正在使用.net 6.0开发应用程序,可能会遇到程序闪退的情况。这篇文章将从多个方面为你解决这个问题。 一、代码问题 代码问题是导致.net 6.0程序闪退的主要原因之一。首…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论