• Java学习笔记(三十)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第三十篇博客。

    本篇博客介绍了Java的网络编程

    本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11

    目录

    网络编程

    网络编程概述

    InetAddress的使用

    UDP发送数据

    UDP接收数据

    UDP通信程序练习


    网络编程

    网络编程概述

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

    在网络通信协议下,实现网络互连的不同计算机上运行的程序可以进行数据交换,称为网络编程

    网络编程的三要素是IP地址,端口和协议。

    IP地址是设备的标识,用于区分不同的计算机。IP地址分为IPv4IPv6。IPv4是为每个主机分配一个4字节地址,用二进制表示,但是经常写成十进制形式,用.分隔。现在IPv4地址几乎耗尽,开始使用IPv6地址,是16位,通常使用十六进制表示。

    端口是应用程序的标识,用于标识设备中的应用程序。端口号是两个字节表示的整数,范围是0-65535。其中0-1023之间的端口号用于一些知名的网络服务和应用,普通程序使用的端口号应该大于1024。

    协议是计算机在连接和通信时要遵守的一定的规则。协议对数据的传输格式、传输速率和传输步骤等进行了统一规定,通信双方都要遵守。协议有TCP协议UDP协议HTTP协议等。

    UDP协议是用户数据报协议,是无连接通信协议,在数据传输时发送端和接收端不建立逻辑连接。使用UDP协议消耗资源少,效率高,通常用于音频、视频和普通数据的传输。传输重要数据时不建议使用UDP协议。

    TCP协议是传输控制协议,是面向连接的通信协议。传输数据前发送端和接收端建立逻辑连接(需要三次握手),然后再传送数据。提供了可靠无差错的数据传输。TCP协议应用十分广泛,用于上传文件,下载文件,浏览网页等。

    这部分内容在计算机网络课会详细讲解。

    InetAddress的使用

    为了方便对IP地址的获取和操作,Java提供了InetAddress类。此类表示IP地址,使用此类需要导包,import java.net.InetAddress

    static InetAddress getByName(String host)确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址。

    String getHostName()获取此IP地址的主机名。

    String getHostAddress()返回文本显示的IP地址字符串。

    1. import java.net.InetAddress;
    2. import java.net.UnknownHostException;
    3. public class webtest1 {
    4. public static void main(String[] args) throws UnknownHostException {
    5. InetAddress ia = InetAddress.getByName("LAPTOP");
    6. System.out.println(ia.getHostName());
    7. System.out.println(ia.getHostAddress());
    8. }
    9. }

    程序的输出是:

    LAPTOP
    192.168.0.100

    UDP发送数据

    UDP协议的通信两端各建立一个Socket对象,但是这两个Socket只进行发送,没有所谓的客户端和服务器的概念。Java提供DatagramSocket类作为基于UDP协议的Socket,使用此类需要导包,import java.net.DatagramSocket

    发送数据需要创建发送端的Socket对象,然后创建数据并把数据打包,随后调用DatagramSocket对象的方法发送数据,最后关闭发送端(用close关闭)。

    把数据打包需要一个DatagramPacket类对象(需要导包,import java.net.DatagramPacket)。其构造方法为DatagramPacket(byte[] buf,int length,InetAddress address,int port)

    buf是一个byte类型数组,存储待发送数据。length是数据的长度。address是一个InetAddress类对象。port是端口。

    发送数据调用DatagramSocket类对象的send方法,格式是:

    void send(DatagramPacket p)

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.io.InputStreamReader;
    4. import java.io.BufferedReader;
    5. import java.net.DatagramSocket;
    6. import java.net.DatagramPacket;
    7. import java.net.SocketException;
    8. import java.net.InetAddress;
    9. public class udptest1 {
    10. public static void main(String[] args) throws IOException {
    11. InputStream is = System.in;
    12. InputStreamReader isr = new InputStreamReader(is);
    13. BufferedReader br = new BufferedReader(isr);
    14. DatagramSocket ds = new DatagramSocket();
    15. String s;
    16. while((s = br.readLine()) != null){
    17. if(s.equals("886")){
    18. break;
    19. }
    20. byte[] byts = s.getBytes();
    21. DatagramPacket dp = new DatagramPacket(byts,byts.length,InetAddress.getByName("LAPTOP"),10000);
    22. ds.send(dp);
    23. }
    24. ds.close();
    25. }
    26. }

    程序利用前面的内容包装了一个输入流,然后进行输入,只要输入内容不是886就进行发送。程序设置端口为10000。

    下面是输入的内容:

    2022
    0820
    16
    58
    886

    输入886后程序结束。发送的内容是否被收到,还需要后面内容进行检验。

    UDP接收数据

    接收数据需要建立一个接收端的Socket对象,然后创建一个数据包用于接收数据,再调用DatagramSocket对象的方法接收数据,随后解析数据包并将数据显示在控制台,最后关闭接收端。

    创建接收端Socket对象的方法是:

    DatagramSocket(int port)

    port是端口号,应该与发送数据的一致。发送端的构造方法里面无参数。

    接收数据也需要创建数据包,方法是:

    DatagramPacket(byte[] buf,int length)

    buf是存储数据的byte数组,length是长度。

    接收数据需要调用DatagramSocket对象的receive方法:void receive(DatagramPacket p)

    解析数据包需要用到DatagramPacket的getData方法,该方法返回一个byte数组。

    1. import java.io.IOException;
    2. import java.net.DatagramSocket;
    3. import java.net.DatagramPacket;
    4. import java.net.SocketException;
    5. public class udptest2 {
    6. public static void main(String[] args) throws IOException {
    7. DatagramSocket ds = new DatagramSocket(10000);
    8. while(true){
    9. byte[] byts = new byte[1024];
    10. DatagramPacket dp = new DatagramPacket(byts,byts.length);
    11. ds.receive(dp);
    12. byte[] data = dp.getData();
    13. String s = new String(data,0,data.length).trim();
    14. System.out.println(s);
    15. }
    16. }
    17. }

    程序设置了死循环,不断接收并显示数据。如果发送端已经结束,应该手动停掉程序。

    在启动udptest2类后,启动udptest1类(见上文),可以实现一端输入数据,另一端显示数据。

    这是在udptest1类输入的内容:

    2022
    August 20th
    It is near 17 o'clock
    886

    这是udptest2类输出的内容:

    2022
    August 20th
    It is near 17 o'clock

    UDP通信程序练习

    可以在上面设置使一个类可以允许多个实例。将udptest1类设置为允许多个实例后,可以创建多个类对象,模拟几个不同用户。并同时在udptest2类输出。这两个类的代码见上文。

    下面是三个udptest1类对象输入的内容。

    A
    I like Java
    Now I am very tired
    I am going to have a rest 
    886

    B
    Java is hard
    Oh,you did many things?
    Well,I will study other things,Bye!
    886
     

    C
    Well Java...
    He is always very tired
    There is only myself, how bored!
    I will leave
    886

    而udptest2类将上面除886外所有内容一并输出。

    A
    B
    C
    I like Java
    Java is hard
    Well Java...
    Now I am very tired
    Oh,you did many things?
    He is always very tired
    I am going to have a rest
    Well,I will study other things,Bye!
    There is only myself, how bored!
    I will leave
    网络编程还有一部分关于TCP的,放在下一篇博客中。

  • 相关阅读:
    【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )
    发明专利加急程序
    『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理
    03-安装配置jenkins
    linux centos 创建开机启动的spring boot 服务配置
    基于51单片机水位监测控制报警仿真设计( proteus仿真+程序+设计报告+讲解视频)
    十二、集合操作
    2024上海国际智能驾驶技术展览会(自动驾驶展)
    [虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
    HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126441118