首页 > 编程语言 >九,网络编程UDP和TCP

九,网络编程UDP和TCP

时间:2024-10-21 21:03:35浏览次数:7  
标签:UDP java socket 编程 TCP import

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来支持这些操作。掌握这些知识,你将能够开发出功能强大的网络应用程序。

标签:UDP,java,socket,编程,TCP,import
From: https://www.cnblogs.com/bjynjj/p/18490374

相关文章

  • 人工智能编程助手MarsCode注册和安装步骤
    字节跳动最近推出了人工智能编程助手MarsCode,功能非常强大。下面是安装和使用方法:一、注册MarsCode账号 注册地址:点击注册二、安装VSCode开发工具打开下载网站:https://code.visualstudio.com/点击“DownloadforWindows”按钮,如下图: 下载完毕后进行安装,然后点击按钮安装......
  • 【Javaee】网络编程-UDP基础
     前言UDP是一个高效、快速、简单的传输协议,适合于需要低延迟和实时性的应用本篇将介绍UDP相关的api,并使用UDP构建回显服务器程序。一.UDP与TCP特点UDP:无连接,不可靠,面向数据报,全双工。TCP:有连接,可靠,面向字节流,全双工。何为连接?此处所说的连接是抽象的连接,并不是实际......
  • 流量抓包和网络问题排查,网工不要只会Wireshark,用好TCPdump才是大神!
    你好,这里是网络技术联盟站,我是瑞哥。在网络工程师的日常工作中,流量抓包和网络问题的排查是不可或缺的一环。Wireshark作为图形界面强大的流量分析工具,深受众多网络工程师的喜爱。然而,仅仅依赖Wireshark并不足以成为一个真正的网络排查高手。真正的网络大神往往能熟练运......
  • 高效并行计算:使用C++中的std::thread实现多线程编程
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在现代计算中,随着多核处理器的普及,如何充分利用硬件资源以提升程序性能成为关键问题之一。C++标准库提供了丰富的多线程支持,其中std::thread是用于实现并发计算的核心工具之一。通过合理的多线程设计,程序可以实现......
  • 嵌入式※~CH395Q-UDP
    我自己的原文哦~ https://blog.51cto.com/whaosoft/11683296网络芯片CH395Q-模块使用Socket0作为UDP组播(多播)通信这里演示一下模块使用Socket0作为UDP组播(多播)通信提醒:无论是SPI,USART,并口,程序操作步骤都是一样的!只是不同的接口发指令发给模块,然后用不同的接收......
  • TCP和UDP的报文格式
    TCP和UDP的报文格式  概要 了解TCP和UDP的报文格式对于网络通信、系统设计、故障排查和安全性等多个方面都非常重要。 一、TCP报文格式(TransmissionControlProtocol) TCP是面向连接、可靠的传输协议,其报文格式较复杂。TCP报文的格式如下:  上图简化如下:|......
  • 少儿Scratch图形化编程案例100课——010美妙的图形
     ......
  • 少儿Scratch图形化编程案例100课——008制作动画电影
    ......
  • 【c++篇】:解析c++类--优化编程的关键所在(一)
    文章目录前言一.面向过程和面向对象二.c++中的类1.类的引入2.类的定义3.类的封装和访问限定符4.类的作用域5.类的实例化6.类对象模型三.`this`指针1.`this`指针的引出2.`this`指针的特性3.C语言和c++实现栈Stack的对比前言在程序设计的广袤宇宙中,C++以其强大的功能......
  • shell编程小技巧:进程替换
    今天来给大家介绍一个非常好用的shell编程技巧,即进程替换(Processsubstitution)。进程替换可以将一个进程(程序)的输入或输出当做一个文件来使用。它的两种使用形式为:<(cmd)或>(cmd).需要注意的是,<和>与(之间不能有空格!下面通过一个示例来介绍进程替换的具体用法。假如我有一个......