什么是网络编程?Java如何实现?三次握手和四次挥手?

简介: 什么是网络编程?Java如何实现?三次握手和四次挥手?



什么是网络编程?Java如何实现?三次握手和四次挥手?


1. 什么是网络编程

网络编程

  • 网络编程,就是指在网络通信协议下,不同计算机运行的程序,进行的数据传输,即:计算机与计算机之间,通过网络进行数据传输。
  • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。


常见的软件架构

  • C/S架构:Client/Server – 客户端/服务器,在用户本地需要下载并安装客户端程序,在远程有一个服务器程序。
  • B/S架构:Browser/Server – 浏览器/服务器,只需要一个浏览器,用户通过不同的网址,访问不同的服务器。
  • BS架构 优缺点:
  • ①不需要开发客户端,只需要页面 + 服务端
  • ②用户不需要下载,打开浏览器就能使用
  • ③如果应用过大,用户体验受到影响(缺)
  • CS架构 优缺点:
  • ①画面可以做的十分精美,用户体验好
  • ②需要开发客户端,也需要开发服务端(缺)
  • ③用户需要下载和更新,麻烦(缺)




2. 网络编程三要素

网络编程三要素

  • IP:设备在网络中的地址,是唯一的标识。
  • 端口号:应用程序在设备中唯一的标识。
  • 协议:数据在网络中传输的规则,常见:UDP、TCP、http、https、ftp。


IP

  • IP全称:Internet Protocol,互联网协议地址,也称IP地址,是分配给网上设备的数字标签。

  • IPv4:Internet Protocol version 4,互联网通信协议第四版。
  • 采用32位地址长度,分成四组,每组范围0~255。
  • 最多有2^32个ip,目前已用完。
  • 192.168.开头是私有地址,范围在192.168.0.0 – 192.168.255.255,专供组织机构内部局域网使用。

  • IPv6: Internet Protocol version 6,互联网通信协议第六版。
  • 采用128位地址长度,分为8组。
  • 最多有2^128个ip,正是为了解决IPv4不够用而出现的。


端口号

  • 端口号:应用程序在设备中唯一的标识
  • 端口号是由两个字节表示的整数,取值范围:0 ~ 65535,其中0 ~ 1023之间的端口号用于一些知名的网络服务或者应用,平常使用可以使用1024以上的端口号。
  • == 注意:一个端口号只能被一个应用程序使用。 ==


协议

  • 计算机网络中,连接和通信的规则被称为网络通信协议。
  • OSI参考模型:世界互联协议标准,全球通信规范,模型过于理想化,未能在因特网上进行广泛推广。
  • TCP/IP参考模型(TCP/IP协议):事实上的国际标准


⚪ UDP协议

UDP协议

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议。
  • 速度快,但大小限制一次最多发送64K,数据不安全,数据易丢失。


UDP通信程序

  • 发送数据:
  • ① 创建发送端的DatagramSocket对象
  • 可以通过传入参数,指定绑定的端口。
  • ②数据打包(DatagramPacket)
  • ③发送数据
  • ④释放资源
/**
 * @author .29.
 * @create 2023-10-20 16:44
 */
public class UDPSendM {
    public static void main(String[] args) throws IOException {
        //1. 创建DatagramSocket对象
        // 绑定端口:通过绑定的端口向外发送数据
        //空参:随机选取所有可用端口中的一个来绑定
        //带参:指定端口号进行绑定
        DatagramSocket datagramSocket = new DatagramSocket();
        //2. 打包数据
        String str = "这是使用UDP协议发送的数据";//数据
        byte[] bytes = str.getBytes();        //转换成字节数组
        InetAddress address = InetAddress.getByName("127.0.0.1"); //向这个主机地址发送数据
        int port = 10086; //向这个端口发送数据
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
        //3. 发送数据
        datagramSocket.send(datagramPacket);
        //4.关闭资源
        datagramSocket.close();
    }
}

  • 接收数据:
  • ①创建DatagramSocket对象
  • 一定要绑定端口,端口需要与发送程序的目标端口保持一致!
  • ②接受打包好的数据
  • ③解析数据包
  • ④释放资源
/**
 * @author .29.
 * @create 2023-10-20 17:10
 */
public class UDPReceiveM {
    public static void main(String[] args) throws IOException {
        //1. 创建DatagramSocket对象,必须绑定端口号,并与发送程序的目标端口一致
        DatagramSocket datagramSocket = new DatagramSocket(10086);
        //2. 接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        //receive()是阻塞的,在接收到数据前会一直等待
        datagramSocket.receive(datagramPacket);
        //3. 解析数据
        byte[] data = datagramPacket.getData(); //传输的数据
        InetAddress address = datagramPacket.getAddress();//传输的地址
        int length = datagramPacket.getLength();//数据长度
        int port = datagramPacket.getPort();//传输的端口号
        System.out.println("接收到的数据:" + new String(data,0,length));
        System.out.println("数据从端口" + port + "地址" + address + "发来");
        //4. 释放资源
        datagramSocket.close();
    }
}
  • 输出:
接收到的数据:这是使用UDP协议发送的数据
数据从端口50584地址/127.0.0.1发来


UDP的三种通信方式

  • ①单播: 一对一进行数据传输
  • 上述通信程序采用的就是单播方式。

  • ②组播: 一对多进行数据传输
  • 组播地址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.225是预留的组播地址。
  • 发送端: 第一步创建的是MulticastSocket对象,之后打包数据时目标地址改为组播地址,其余与单播一致。
MulticastSocket ms = new MulticastSocket();
  • 接收端: 第一步创建的是MulticastSocket对象,之后将当前机器添加绑定到发送端的目标组播地址中去:
MulticastSocket ms = new MulticastSocket(10000);
//获取组播地址的对象
InetAddress address = InetAddress.getByName("224.0.0.1");
//MulticastSocket对象添加绑定到组播地址
ms.joinGroup(address);

  • ③广播: 向所有机器进行数据传输
  • 广播地址:225.225.225.225
  • 实现广播,只需要在单播的发送端基础上,将目标地址改为广播地址的225.225.225.225。




⚪ TCP协议

TCP协议

  • 传输控制报协议(Transmission Control Protocol)
  • UDP是面向连接通信协议。
  • 虽速度慢,但没有大小限制,且数据安全。


TCP通信程序

  • TCP协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信。

  • 客户端:
  • ①创建客户端的Socket对象(Socket),与指定服务端连接
  • Socket(String host,int port)
  • ②获取输出流,写数据
  • OutputStream getOutputStream()
  • ③释放资源
  • void close()
/**
 * @author .29.
 * @create 2023-10-20 20:14
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1. 创建Socket对象,与服务端建立连接
        Socket socket = new Socket("127.0.0.1", 10000);
        //2. 获取字节输出流
        OutputStream outputStream = socket.getOutputStream();
        //3. 发送数据
        String s = "这边是客户端,你好呀服务端!";
        outputStream.write(s.getBytes());
        //4. 关闭资源
        outputStream.close();
        socket.close();
    }
}


  • 服务端:
  • ①创建服务端的Socket对象(ServerSocket)
  • ServerSocket(int port)
  • ②监听客户端连接,返回一个Socket对象
  • Socket accept()
  • ③获取输入流,读数据,并显示
  • InputStream getInputStream()
  • ④释放资源
  • void close()
/**
 * @author .29.
 * @create 2023-10-20 20:17
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1. 获取服务端Socket对象,端口号与客户端目标端口号一致
        ServerSocket serverSocket = new ServerSocket(10000);
        //2. 返回一个Socket对象
        Socket accept = serverSocket.accept();
        //3. 获取字节输入流
        InputStream inputStream = accept.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        //4. 获取数据,显示
        int i;
        System.out.println("接收到数据:");
        while((i = inputStreamReader.read()) != -1){
            System.out.print((char)i);
        }
        //5. 释放资源
        inputStreamReader.close();
        accept.close();
        serverSocket.close();
    }
}


· 三次握手和四次挥手

三次握手(确保连接建立)

  • ①客户端首先会向服务器发送连接请求,之后开始等待,等待服务器确认。
  • ②服务器接收到请求后,向客户端返回一个响应,告诉客户端收到请求了。
  • ③得到服务器确认后,再次向服务器发送确认信息,建立连接。

四次挥手(确保连接断开,且数据处理完毕)

  • ①客户端首先向服务器发送取消连接的请求,而后等待响应。
  • ②服务器向客户端返回一个响应,表示收到了取消连接的请求,之后服务器开始处理数据。
  • ③服务器将数据处理完毕后,再次向客户端发出确认取消信息。
  • ④客户端再次发送确认消息,连接取消。




3. InetAddress类

InetAddress类的使用

  • static InetAddress getByName(String host):获取主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址。

  • String getHostName():获取此IP地址的主机名。
  • String getHostAddress():返回文本显示中的IP地址字符串。
/**
 * @author .29.
 * @create 2023-10-20 15:51
 */
public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //1. 获取InetAddress对象(一台设备的对象),传入的可以是IP地址,也可以是机器名称
        InetAddress inetAddress = InetAddress.getByName("LAPTOP-TB1IVJR9");
        System.out.println(inetAddress); // LAPTOP-TB1IVJR9/192.168.88.1
        InetAddress inetAddress2 = InetAddress.getByName("192.168.88.1");
        System.out.println(inetAddress2); // /192.168.88.1
        //2. 获取InetAddress对象的设备名称
        String hostName = inetAddress.getHostName();
        System.out.println(hostName); // LAPTOP-TB1IVJR9
        //3. 获取InetAddress对象的ip地址字符串
        String hostAddress = inetAddress.getHostAddress();
        System.out.println(hostAddress); // 192.168.88.1
    }
}




目录
相关文章
|
20天前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
40 7
|
3月前
|
Java
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
【思维导图】JAVA网络编程思维升级:URL与URLConnection的逻辑梳理,助你一臂之力!
56 1
|
3月前
|
XML JSON 搜索推荐
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
【高手过招】JAVA网络编程对决:URL与URLConnection的高级玩法,你敢挑战吗?
66 0
|
20天前
|
安全 Java API
深入探索Java网络编程中的HttpURLConnection:从基础到进阶
本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
|
20天前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
43 9
|
20天前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
40 5
|
24天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
19 1
|
1月前
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。
|
3月前
|
Java
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
|
3月前
|
Java
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
40 3