• JavaSE学习——网络编程


    计算机网络

    把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。

    网络编程

    Java提供的网络类库,可以实现网络连接联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个 跨平台的网络库,程序员面对的是一个统一的网络编程环境

    **网络编程的目的:**直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。

    网络编程中由两个主要的问题:

    1. 如何准确的定位网络上一台或多台主机;定位主机上的特定的应用
    2. 找到主机后如何可靠高效的进行数据传输

    网络编程中的三个要素:

    1. IP地址:网络中设备的标识,不易记忆,可用主机名
    2. 端口号:用于标识进程的逻辑地址,不同进程的标识
    3. 传输协议: 通讯的规则常见协议:TCP,UDP

    IP地址

    所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。

    IP地址的组成

    IP地址 = 网络地址+主机地址
    A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
    B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
    C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码

    IP地址分类

    A类 1.0.0.1—127.255.255.254
    (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
    (2)127.X.X.X是保留地址,用做循环测试用的。
    B类 128.0.0.1—191.255.255.254 172.16.0.0—172.31.255.255是私有地址。
    C类 192.0.0.1—223.255.255.254 192.168.x.x是私有地址
    D类 224.0.0.1—239.255.255.254
    E类 240.0.0.1—247.255.255.254

    特殊地址

    127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
    DOS命令 ipconfig:查看本机IP地址
    xxx.xxx.xxx.255 广播地址

    端口

    设备与外界通讯交流的出口,可以理解为一个进出房间的门。

    端口号:标识正在计算机上运行的进程

    要求: 不同的进程有不同的端口号
    范围: 被规定为一个16位的整数0-65535

    端口号与IP地址的组合得出一个网络套接字:Socket

    逻辑端口分类: TCP端口和UDP端口。

    网络协议

    计算机网络中实现通信必须要有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

    Osi七层参考模型

    应用层:实现人机交互的界面
    表示层:编码 解码 加密 解密
    会话层:建立 维持 终止会话进程
    传输层:通过端口号区分不同服务,数据分段
    网络层:通过ip地址进行逻辑寻址 路由器
    数据链路层: 媒介访问控制层 MAC
             逻辑链路层   llc 为上层提供fcs校验
    物理层:定义电气电压接口规范光学特性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    UDP协议:非面向连接的不可靠传输协议

    • 将数据源和目的地封装成数据包,不需要建立连接;
    • 每个数据报包的大小在限制在64k;
    • 因无连接,是不可靠协议
    • 不需要建立连接,速度快,效率高

    TCP协议: 面向连接的可靠传输协议

    • 建立连接,形成传输数据的通道;
    • 在连接中进行大数据量传输;
    • 需要连接所以是可靠协议;
    • 必须建立连接,效率会稍低

    Tcp面向连接体现在三次握手
    在这里插入图片描述

    四次断开

    在这里插入图片描述

    UDP网络编程

    客户端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    import java.net.SocketException;
    
    public class TestUDP {
        public static void main(String[] args) {
            DatagramSocket socket = null;
            try {
            	// 注意,创建一个udp socket对象,默认占据了8080
                socket = new DatagramSocket(8080);
    			
    			//提供发送的信息
                String msg = "Hello World";
                byte[] buf = msg.getBytes();
    			
    			// 数据报对象
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("127.0.0.1", 8888));
    			
    			//发送数据
                socket.send(packet);
                System.out.println("发送成功");
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //关闭资源
            	if (socket != null){
                	socket.close();
            	}
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    服务器端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.DatagramSocketImpl;
    import java.net.SocketException;
    
    public class TestUDP02 {
        public static void main(String[] args) {
            DatagramSocket socket = null;
            try {
                socket = new DatagramSocket(8888);
                while (true) {
                    byte[] buf = new byte[1024];
                    DatagramPacket pd = new DatagramPacket(buf, 0, buf.length);
                    System.out.println("正在等待客户端发送数据……");
                    // 等待接受数据
                    socket.receive(pd);
                    System.out.println("接收到数据……");
                    // 将数据转换出来
                    byte[] msg = pd.getData();
                    String sendIP = pd.getAddress().getHostAddress();
                    int sendPort = pd.getPort();
                    System.out.println("接受到"+ sendIP +":"+ sendPort +"发送过来的数据,数据是:"+ new String(msg));
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                socket.close();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    TCP网络编程

    客户端:

    import java.io.*;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    
    public class TestSocket {
    
        public static final String DES_IP = "192.168.1.3";
        public static final int DES_PORT = 8080;
    
        public static void main(String[] args) {
            Socket socket = new Socket();
    
            try {
                socket.connect(new InetSocketAddress(DES_IP, DES_PORT));
                System.out.println("成功连接到服务器");
    
                InputStream is = socket.getInputStream();
                String msg = null;
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                while ((msg = br.readLine()) != null){
                    System.out.println("接收到服务器传递过来的数据,数据是:" + msg);
                }
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                out.println("Hello World!");
                out.println("DDDDDDD");
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    服务器端:

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TestSocketServer {
        public static void main(String[] args) {
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(8080);
                while (true){
                    System.out.println("服务器开始运行了,等待客户端连接上来");
                    Socket socket = serverSocket.accept();
                    System.out.println(socket.getInetAddress().getHostName());
                    System.out.println(socket.getLocalAddress());
                    System.out.println(socket.getPort());
    
                    //推送一条消息过去
                    String msg = "欢迎您进入我们的QQ";
                    OutputStream os = socket.getOutputStream();
                    PrintWriter out = new PrintWriter(os, true);
                    out.println(msg);
    
                    //要写在线程里
    //                InputStream is = socket.getInputStream();
    //                msg = null;
    //                BufferedReader br = new BufferedReader(new InputStreamReader(is));
    //                while ((msg = br.readLine()) != null){
    //                    System.out.println("接收到客户端传" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "递过来的数据,数据是:" + msg);
    //                }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    【云原生】Nacos-TaskManager 任务管理的使用
    TestNG如何编排测试用例,第3种方式最实用
    android_使用adb安装app包的详细步骤和可能遇到的问题(apk文件)
    加密与安全_探索对称加密算法
    揭秘未来:用线性回归模型预测一切的秘密武器!
    关于小程序session_key漏洞问题的解决2022-12-01
    Redis数据结构详解
    C++基础算法总结
    网页设计期末课程设计大作业 HTML、CSS 海绵宝宝动漫网页作业
    介绍rabbitMQ
  • 原文地址:https://blog.csdn.net/Demon_and_Angle_/article/details/126387829