day21 网络编程

  • JavaSE
  • JavaSE
约 1638 字

网络编程

  • 网络通讯三要素
    • IP 地址:计算机的唯一标识,它是通过本地网络和本计算机综合计算得到的
      • PIV4: 互联网通信协议版本 4(英语:Internet Protocol version 4,IPv4)
        • 32 位二进制输入 (10010001. 10010001. 10010001. 10010001 )
        • 点分十进制:(100.4.5.6)
      • PIV6:
        • 128 位 (10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001. 10010001)
        • 冒分十六进制 ((ABCD:EF01:2345:6789:ABCD:EF01:2345:6789)
      • 查询:ipconfig 和 ipconfig -all
    • 端口号
      • 应用程序的唯一标识
      • 0-65535(0-1024,部分默认应用的端口号,自定义端口号应使用 1024 后的端口号)
      • 但两个端口号相同的应用打开时,后打开的应用将无法使用
        • 解决方案
          • 换端口号
          • 关闭之前应用端口
            • PID(进程 ID)
            • netstat -ano
    • 协议 (protocol)
      • 通信约定 (网络通信协议)
      • 体现在数据包的格式上
  • OSI 网络七层模型:OSI 是 Open System Interconnection 的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了 OSI 模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI 模型把网络通信的工作分为 7 层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。image-20220224234202210

InetAddress

package note;  
  
import java.net.InetAddress;  
import java.net.UnknownHostException;  
  
/**  
 * @Description IP地址、域名的使用  
 * @Author Noby  
 * @Date 2023/3/19 13:50  
 */public class InetAddressNote {  
    public static void main(String[] args) throws UnknownHostException {  
        InetAddress localHost = InetAddress.getLocalHost();//获取本机地址  
        InetAddress myComputer = InetAddress.getByName("LAPTOP-7JVG6UKI");//根据主机名获取地址  
        InetAddress baiduDomain = InetAddress.getByName("www.baidu.com");//根据域名获取地址  
        InetAddress baiduIP = InetAddress.getByName("163.177.151.110");//根据ip获取地址  
  
        System.out.println("localHost = " + localHost);  
        System.out.println("myComputer = " + myComputer);  
        System.out.println("baiduDomain = " + baiduDomain);  
        System.out.println("baiduIP = " + baiduIP);  
  
    }  
}

UDP 协议

  • UDP(User Datagram Protocol)协议是一种传输层协议,它提供了一种无连接、不可靠的数据传输服务。在网络通信中,UDP 协议主要用于实时传输数据,例如音频、视频等。
  • 与 TCP 协议不同,UDP 协议不需要在客户端和服务器之间建立连接,也不保证数据传输的可靠性。它只是简单地将数据包发送到目标地址,不进行确认、重传等操作。因此,UDP 协议的传输速度比 TCP 协议快,但同时也存在丢包、乱序等问题。
  • UDP 协议的应用场景主要包括在线游戏、流媒体等需要实时传输数据的场景。由于不需要建立连接,UDP 协议的开销比 TCP 协议小,因此对于一些带宽较小的场景,UDP 协议也可以提供更好的传输性能。但需要注意的是,在使用 UDP 协议时需要自行处理数据的可靠性和安全性问题。
  • 广播地址:在局域网中有一个地址,如果将消息发送到该地址,那么局域网内所有的设备都能收到,(默认为 xxx.xxx.xxx.255)
package note;  
  
import java.io.IOException;  
import java.net.*;  
  
/**  
 * @Description UDP数据报协议,发送端  
 * @Author Noby  
 * @Date 2023/3/19 13:55  
 */public class UDPSendNote {  
    public static void main(String[] args) throws IOException {  
        String info = "How are you?中文";  
        //1、创建套接字  
        DatagramSocket datagramSocket = new DatagramSocket();//DatagramSocket实现UDP协议  
        //2、获取数据报  
        DatagramPacket datagramPacket = new DatagramPacket(info.getBytes(),info.getBytes().length, InetAddress.getLocalHost(),11111);  
        //3、发送数据  
        datagramSocket.send(datagramPacket);  
        //4、关闭套接字  
        datagramSocket.close();  
    }  
}
package note;  
  
import java.io.IOException;  
import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
  
/**  
 * @Description UDP数据报协议,接收端  
 * @Author Noby  
 * @Date 2023/3/19 13:56  
 */public class UDPReceiveNote {  
    public static void main(String[] args) throws IOException {  
        //1、创建套接字  
        DatagramSocket datagramSocket = new DatagramSocket(11111);  
        //2、创建数据报  
        byte[] bytes = new byte[1024];  
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);  
        //3、获取数据  
        datagramSocket.receive(datagramPacket);//receive方法:阻塞方法,没接收到任何数据时就等待消息,程序暂停执行  
        //4、关闭套接字  
        datagramSocket.close();  
  
        System.out.println(new String(bytes,0,datagramPacket.getLength()));//datagramPacket.getLength() 获取接收到数据的长度  
  
//        while(true) {  
//            datagramSocket.receive(datagramPacket);//receive方法:阻塞方法,没接收到任何数据时就等待消息,程序暂停执行  
//  
//            System.out.println(new String(bytes,0,datagramPacket.getLength()));//datagramPacket.getLength() 获取接收到数据的长度  
//  
//        }  
    }  
}

TCP 协议

  • TCP(Transmission Control Protocol)协议是一种传输层协议,它提供了可靠的、面向连接的数据传输服务。在网络通信中,TCP 协议通常用于传输 HTTP 协议中的数据。具体来说,HTTP 协议使用 TCP 协议的连接服务,通过 TCP 协议在客户端和服务器之间建立连接,然后在连接上进行数据传输。
  • HTTP(Hypertext Transfer Protocol)协议是一种应用层协议,它定义了客户端和服务器之间进行通信的规则。它主要用于 Web 应用程序中,包括网页浏览、文件下载、在线视频等。
package note;  
  
import java.io.OutputStream;  
import java.net.InetAddress;  
import java.net.Socket;  
/**  
 * @Description TCP数据报协议,发送端  
 * @Author Noby  
 * @Date 2023/3/19 13:56  
 */public class TCPSendNote {  
    public static void main(String[] args) throws Exception{  
        Socket socket = new Socket(InetAddress.getLocalHost(), 11111);//Socket底层实现了TCP协议  
        String info = "TCPInfo中文";  
        OutputStream outputStream = socket.getOutputStream();  
        outputStream.write(info.getBytes());  
        socket.close();  
    }  
}
package note;  
  
  
import java.io.InputStream;  
import java.net.ServerSocket;  
import java.net.Socket;  
/**  
 * @Description TCP数据报协议,接收端  
 * @Author Noby  
 * @Date 2023/3/19 13:56  
 */public class TCPReceiveNote {  
    public static void main(String[] args) throws Exception{  
        ServerSocket serverSocket = new ServerSocket(11111);  
        Socket socket = serverSocket.accept();  
        byte[] bytes = new byte[1024];  
        InputStream inputStream = socket.getInputStream();  
        int len = inputStream.read(bytes);  
        socket.close();  
        serverSocket.close();  
        System.out.println(new String(bytes, 0, len));  
    }  
}

UDP 与 TCP 的区别

  • UDP 无连接协议 (源端和终端不建立连接)、TCP 有连接 (源端和终端建立连接)
    • UDP 发送数据时不需要建立连接,直接将数据发送到网络上就行,不考虑接收方是否能接受消息
    • TCP 必须建立连接,否则无法发送数据,通过三次握手建立连接
  • UDP 不可靠、TCP 可靠。UDP 不安全、TCP 安全
    • UDP 只管发,接收方是否能收到无所谓,可能会造成数据丢失问题
    • TCP 发送完数据之后需要等待服务端确认,如果没收到确认信息会重复发送数据,收到之后会继续发送下一个数据
  • UDP 传输效率高,TCP 相对较低
    • UDP 只管发不需要等待接收端返回确认消息,而 TCP 每次发送数据之后都需要等待服务端返回确认消息
  • UDP、TCP 的使用场景
    • UDP:通知、广播
    • TCP:实时数据传输、web 项目(http 协议基于 tcp 实现的)

TCP 协议的三次招手,四次挥手

image-20220224234607226

image-20220224234837656

上次编辑于:
贡献者: Noby338,noby