• 【JAVA入门】网络编程


    目录

    思维导图

    一、网络编程入门

    1、网络编程概述

    2、网络编程三要素

    二、UDP协议

    1、UDP发送数据

    2、UDP接收数据

    三、TCP通信程序

    1、TCP通信原理

    2、TCP发送数据

    3、TCP接收数据


    思维导图

    一、网络编程入门

    1、网络编程概述

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

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

    2、网络编程三要素

    2.1、IP地址、端口、协议

    IP地址:

    • 为了让网络中的计算机能够相互通信,必须为没台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机和识别发送的计算机,IP地址就是标识号,也是设备的标识

    端口:

    • 网络的通信,本质上是两个应用程序的通信,每台计算机都有很多的应用程序,在网络通信时,端口号就可以唯一标识设备中的应用程序,也就是应用程序的标识

    协议:

    • 通过计算机网络可以使多态计算机实现连接,位于同一网络中的计算机在进行连接和通信时要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了同一规定,通信双方必须遵守才能完成数据交换,常见的协议有UDP协议和TCP协议。

    2.2、IP地址

    IP地址:时网络中设备的为一标识,分为IPV4和IPV6两大类

    IPV4:给每个连接在网络上的主机分配一个32bit地址,按照TCP/IP规定,IP地址用二进制来表示,每个地址长32bit,也就是4个字节,为了方便使用,IP地址通常写成10进制的形式,中间使用’ .‘分格不同字节(点分十进制表示法)。

    IPV6:为扩大地址空间,IPV6采用128 位地址长度,分成8 组16进制数。

    2.2.1、常用命令

    • ipconfig :查看本机地址

    • ping IP地址:检查网络是否连通

    特殊IP地址

    • 172.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

    2.2.2、InetAddress类

    为了方便对IP地址的获取和操作,Java提供了InetAddress供我们使用

    InetAddress:此类表示Internet协议地址

    常用方法

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

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

    String getHostAdress():返回文本显示中的IP地址字符串

    1. public class Demo2 {
    2.   public static void main(String[] args) throws UnknownHostException {
    3.       //static InetAddress getByName(String host):确定主机名称的IP地址,主机名可以是机器名称或IP地址
    4.       InetAddress address =InetAddress.getByName("LAPTOP-O4PAJK5L");
    5.      //String getHostName():获取此IP地址的主机名
    6.       String name =address.getHostName();
    7.       System.out.println(name);
    8.       //String getHostAdress():返回文本显示中的IP地址字符串
    9.       String str=address.getHostAddress();
    10.       System.out.println(str);
    11. }
    12. }

    2.3、端口

    端口:设备上应用程序的唯一标识

    端口号:用两个字节表示的整数,它的取值范围是0~65535,其中,0~1023之间的端口号用于一写知名的网络服务和应用,普通应用程序需要使用1024以上的端口号,如果端口号被另一个服务或应用占用会导致当前程序启动失败。

    2.4、协议

    协议:计算机网络中,连接和通信的规则被称为网络通信协议

    UDP协议:用户数据报协议(User Datagram Protocol)

    • 面向无连接的的通信协议,传输时发送端和接收端不建立逻辑连接(发出数据前不确认接收端是否存在,接收端接收到数据后也不会返回是否接收到数据),消耗资源小,通信效率高,一般用于音频,视频和普通数据的传输,传输重要数据是不建议使用

    TCP协议:传输控制协议(Transmission Protocol)

    • 面向连接的通信协议,传输前发送端和接收端会建立逻辑连接,然后再传输数据。提供了两台计算机之间的可靠无差错的数据传输,在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的船舰都需要经过“三次握手”,可以保证传输数据的安全。

    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接问题

      (1)第一次:客户端向服务器端发出连接请求,等待服务器确认

      (2)第二次:服务器端向客户端回送一个响应,通知客户端收到了连接请求

      (3)第三次:客户端再次向服务器发送确认信息,确认连接

    二、UDP协议

    UDP协议是一种不可靠的网络协议,他在通信的两端各建立一个Socket对象,但是这两个Socket只是发送、接收数据的对象,因此对于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。

    1、UDP发送数据

    发送数据步骤

    (1)创建发送端的Socket对象(DatagramSocket)

    (2)创建数据,并把数据打包

    (3)调用DatagramSocket对象的方法发送数据

    (4)关闭发送端

    1. public class Demo2 {
    2.   public static void main(String[] args) throws IOException {
    3.    //(1)创建发送端的Socket对象(DatagramSocket)
    4.    DatagramSocket ds= new DatagramSocket();
    5.    //(2)创建数据,并把数据打包
    6.    // DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    7.    // 构造一个数据包发送长度length的数据包到指定主机上的指定端口号
    8.    byte[] bys= "helloworld,你好!".getBytes();//数据包
    9. //   写法一
    10. //   int length = bys.length;//长度length
    11. //   InetAddress address=InetAddress.getByName("172.20.80.131");//主机
    12. //   int port=10086;//端口号
    13. //   DatagramPacket dp=new DatagramPacket(bys,length,address,port);
    14. DatagramPacket dp=new DatagramPacket(bys,bys.length,InetAddress.getByName("172.20.80.131"),10086);//写法二
    15.    //(3)调用DatagramSocket对象的方法发送数据
    16.    ds.send(dp);//发送数据报包
    17.    //(4)关闭发送端
    18.    ds.close();
    19. }
    20. }

    2、UDP接收数据

    接收数据的步骤

    (1)创建接收端的Socket对象(DatagramSocket)

    (2)创建一个数据包,用于接收数据

    (3)调用DatagramSocket对象的方法接收数据

    (4)解析数据包,并把数据在控制台显示

    (5)关闭接收端

    1. public class Demo2 {
    2.   public static void main(String[] args) throws IOException {
    3.     //(1)创建接收端的Socket对象(DatagramSocket)
    4.     //DatagramSocket(int port)指定一个端口
    5.     DatagramSocket ds=new DatagramSocket(10086);
    6.     //(2)创建一个数据包,用于接收数据
    7.     // DatagramPacket(byte[] buf,int length)接收数据包
    8.      byte[] bys=new byte[1024] ;
    9.      DatagramPacket dp = new DatagramPacket(bys,bys.length);
    10.      //(3)调用DatagramSocket对象的方法接收数据
    11.      ds.receive(dp);
    12.      //(4)解析数据包,并把数据在控制台显示
    13.      //byte[] data = dp.getData();//数据缓冲区
    14.      //int len =dp.getLength();//实际数据长度
    15.      //String dataString = new String(data,0,len);
    16.      //System.out.println("数据是:"+dataString);
    17.      System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
    18.      //(5)关闭接收端
    19.      ds.close();
    20. }
    21. }

    三、TCP通信程序

    1、TCP通信原理

    TCP 通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路。

    一旦建立了虚拟网络链路,两端的程序就可以通过虚拟链路进行通信

    Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生io流来进行网络通信。

    2、TCP发送数据

    发送数据步骤

    (1)创建客户端的Socket对象(Socket)

    (2)获取输出流,写数据

    (3)释放资源

    1. public class Demo2 {
    2.   public static void main(String[] args) throws IOException {
    3.   //(1)创建客户端的Socket对象(Socket)
    4.     //Socket(InetAddress address,int port);
    5. //     Socket sc=new Socket(InetAddress.getByName("172.20.80.131"),10086);
    6.     //Socket(String host,int port);
    7.      Socket sc=new Socket("172.20.80.131",10086);
    8.      //(2)获取输出流,写数据
    9.       OutputStream os = sc.getOutputStream();
    10.       os.write("hello,你好!".getBytes());
    11.       //(3)释放资源
    12.       sc.close();
    13. }
    14. }

    3、TCP接收数据

    接收数据的步骤

    (1)创建服务器端的Socket对象(ServerSocket)

    (2)监听客户端,返回Socket对象

    (3)获取输入流,读数据,并把数据显示在控制台

    (4)释放资源

    1. public class Demo2 {
    2.   public static void main(String[] args) throws IOException {
    3.      //(1)创建服务器端的Socket对象(ServerSocket)
    4.       ServerSocket ss=new ServerSocket(10086);//指定端口
    5.       //(2)监听客户端,返回Socket对象
    6.       Socket s=ss.accept();//侦听要连接到此套接字并接受他
    7.       //(3)获取输入流,读数据,并把数据显示在控制台
    8.       InputStream is=s.getInputStream();
    9.       byte[] bys=new byte[1024];
    10. //       int len = is.read(bys);
    11. //       String data=new String(bys,0,len);
    12. //       System.out.println("数据是:"+data);
    13.       System.out.println("数据是:"+new String (bys,0,is.read(bys)));
    14.       //(4)释放资源
    15.       s.close();
    16.       ss.close();
    17. }
    18. }

    练习

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.io.OutputStream;
    4. import java.net.Socket;
    5. public class Client {//客户端
    6. public static void main(String[] args) throws IOException {
    7. //创建客户端
    8. Socket s=new Socket("172.20.80.131",10086);
    9. //获取输出流,写入数据
    10. OutputStream os = s.getOutputStream();
    11. os.write("hello".getBytes());
    12. //接收服务端反馈
    13. InputStream is = s.getInputStream();
    14. byte[] bys=new byte[1024];
    15. System.out.println("客户端:"+new String(bys,0,is.read(bys)));
    16. //释放资源
    17. s.close();
    18. }
    19. }
    20. =======================================================================================
    21. import java.io.IOException;
    22. import java.io.InputStream;
    23. import java.io.OutputStream;
    24. import java.net.ServerSocket;
    25. import java.net.Socket;
    26. public class Server{//服务器端
    27. public static void main(String[] args) throws IOException {
    28. //创建服务器端的Socket对象
    29. ServerSocket ss=new ServerSocket(10086);
    30. //监听客户端,返回Socket对象
    31. Socket s=ss.accept();
    32. //获取输入流,读数据,并输出到控制台
    33. InputStream is = s.getInputStream();
    34. byte [] bys=new byte[1024];
    35. System.out.println("服务器:"+new String(bys,0,is.read(bys)));
    36. //给反馈
    37. OutputStream os = s.getOutputStream();
    38. os.write("数据已收到".getBytes());
    39. //释放资源
    40. s.close();
    41. ss.close();
    42. }
    43. }

  • 相关阅读:
    2024年CSP-J暑假冲刺训练营(2):排序
    力扣(LeetCode)809. 情感丰富的文字(C++)
    利用结构体完成图书新增交互
    libevent源码跨平台编译(windows/macos/linux)
    cuda系列详细教程-花絮
    代码保护软件VMProtect用户手册之内置脚本的使用(4)——关于功能的类
    《c++ Primer Plus 第6版》读书笔记(4)
    直播带货平台有哪些
    Prompts(二)
    【夯实算法基础】 并查集
  • 原文地址:https://blog.csdn.net/qq_49047454/article/details/126785740