九,网络编程UDP和TCP

Java网络编程详解:从基础到实践

网络编程是现代软件开发中不可或缺的一部分。在Java中,我们可以通过多种方式实现网络通信,其中最常用的是UDP和TCP协议。本文将详细介绍Java网络编程的基础知识、UDP和TCP编程的核心概念和实现方法。

网络编程概述

计算机网络定义

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程定义

网络编程是指实现网络互连的不同计算机上运行的程序间可以进行数据交换的技术。

网络模型

网络模型定义了计算机网络之间以何种规则进行通信。常见的网络模型包括OSI(Open System Interconnection开放系统互连)参考模型和TCP/IP参考模型。

OSI参考模型

OSI模型将网络通信分为七层:

  1. 应用层:为应用软件提供网络服务。
  2. 表示层:数据格式转换、数据加密解密等。
  3. 会话层:建立、管理和终止应用程序之间的会话。
  4. 传输层:提供端到端的通信服务,确保数据完整性。
  5. 网络层:负责数据包的寻址和路由。
  6. 数据链路层:在相邻节点间提供数据传输。
  7. 物理层:传输原始的比特流。

TCP/IP参考模型

TCP/IP模型是互联网的基础,它简化了OSI模型,通常分为四层:

  1. 应用层:对应OSI模型的应用层、表示层和会话层。
  2. 传输层:对应OSI模型的传输层。
  3. 网际层:对应OSI模型的网络层。
  4. 主机至网络层:对应OSI模型的数据链路层和物理层。

网络通信三要素

IP地址

IP地址是网络中设备的标识,类似于电话号码。在TCP/IP协议中,IP地址用于指定要接受数据的计算机和识别发送的计算机。Java提供了InetAddress类来方便我们对IP地址的获取和操作。

InetAddress类的使用

import java.net.InetAddress;

public class InetAddressExample {
    public static void main(String[] args) throws Exception {
        // 获取任意主机的IP地址
        InetAddress addr = InetAddress.getByName("www.example.com");
        System.out.println("Host Name: " + addr.getHostName());
        System.out.println("IP Address: " + addr.getHostAddress());
    }
}

端口号

端口号用于标识进程的逻辑地址,不同进程的标识。有效端口范围是065535,其中01024为系统使用或保留端口。我们可以通过netstat -ano命令查看端口号。

传输协议

传输协议定义了通信的规则。常见的协议包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。

UDP编程

UDP是一种无连接的协议,它将数据源和目的封装成数据包中,不需要建立连接。UDP的特点是速度快,但不可靠。

UDP传输流程

  1. 建立UDP的DatagramSocket服务。
  2. 通过receive方法接收数据。
  3. 将收到的数据存储到DatagramPacket对象中。
  4. 通过DatagramPacket对象的功能对接收到的数据进行解析。
  5. 关闭资源。

UDP发送端代码示例

import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.DatagramPacket;

public class UDPSender {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        String message = "Hello UDP";
        byte[] buf = message.getBytes();
        InetAddress address = InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9876);
        socket.send(packet);
        socket.close();
    }
}

UDP接收端代码示例

import java.net.DatagramSocket;
import java.net.DatagramPacket;

public class UDPReceiver {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(9876);
        byte[] buf = new byte[256];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);
        String received = new String(packet.getData(), 0, packet.getLength());
        System.out.println("Received: " + received);
        socket.close();
    }
}

TCP编程

TCP是一种面向连接的协议,它在数据传输前需要建立连接,并在连接中进行数据传输。

TCP传输流程

  1. 建立客户端的Socket服务,并明确要连接的服务器。
  2. 如果连接建立成功,就表明已经建立了数据传输的通道。就可以在该通道通过IO进行数据的读取和写入。该通道称为Socket流,Socket流中既有读取流,也有写入流。
  3. 通过Socket对象的方法,可以获取这两个流。
  4. 通过流的对象可以对数据进行传输。
  5. 如果传输数据完毕,关闭资源。

TCP客户端代码示例

import java.net.Socket;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.PrintStream;

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 9876);
        OutputStream out = socket.getOutputStream();
        PrintStream p = new PrintStream(out);
        p.println("Hello TCP Client");
        InputStream in = socket.getInputStream();
        int i;
        while ((i = in.read()) != -1) {
            System.out.print((char) i);
        }
        socket.close();
    }
}

TCP服务器端代码示例

import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.PrintStream;

public class TCPServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9876);
        Socket socket = serverSocket.accept();
        OutputStream out = socket.getOutputStream();
        PrintStream p = new PrintStream(out);
        p.println("Hello TCP Server");
        InputStream in = socket.getInputStream();
        int i;
        while ((i = in.read()) != -1) {
            System.out.print((char) i);
        }
        socket.close();
        serverSocket.close();
    }
}

总结

网络编程是现代软件开发中的一项基本技能。通过本文的介绍,你应该已经了解了网络编程的基本概念、UDP和TCP协议的工作原理以及如何在Java中实现这些协议的编程。无论是UDP的无连接通信还是TCP的面向连接通信,Java都提供了强大的API来支持这些操作。掌握这些知识,你将能够开发出功能强大的网络应用程序。

posted @   bjynjj  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示