网络编程、UDP、TCP、服务端优化方式

目录

网络编程三要素

IP 

网络编程-常见命令

网络编程-Inetaddress类

端口

网络编程三要素-协议

UDP-发送端

UDP-接收端

UDP-练习

 UDP-三种通讯方式

UDP-组播代码实现

UDP-广播代码实现

TCP-客户端

TCP-服务器

TCP-原理分析

TCP-三次握手

TCP-四次握手

TCP-练习1

TCP-练习2

服务端优化-循环

 服务端优化-UUID

服务端优化-多线程

服务端优化-线程池


网络编程三要素

什么是网络编程?
            在网络通信协议下, 不同计算机上运行的程序, 相互可以进行数据传输
    
思考: A电脑的FeiQ, 发送信息给B电脑中的FeiQ, 需要知道什么条件才能发送?
            1. 电脑的地址
            2. FeiQ接收数据的入口
            3. 网络种传输数据的规则 
    
网络编程三要素
            1. IP地址: 设备在网络中的地址, 是一个唯一标识
            2. 端口号: 应用程序在设备中的唯一标识
            3. 协议: 数据在网络中传输的规则, 常见协议有UDP协议和TCP协议

IP 

网络编程三要素: IP
    IP全称"互联网协议地址", 也称"IP地址", 是分配给上网设备的数字标签
    常见的IP分类为IPv4和IPv6
    
平时我们用的是域名呀, 怎么不是IP地址?
    计算机的域名,通过DNS服务器解析域名为IP ,然后返回给计算机
    计算机 -> IP -> 目标服务器 -> 目标服务器返回数据
    
IPv4: 
    32bit位(4字节)组成 -> 11000000 10101000 00000001 01000010
    通过"点分十进制表示法" -> 192.168.1.66
    一个字节表示0-255(256位), 4个字节全球最多只能有将近43亿个IP, 不能满足现在互联网的发展
        
IPv6:
    128bit位(16字节)组成, 分为8组 -> 略
    通过"冒分16进制表示法" -> 2001:0DB8:0000:0023:0008:0800:200C:417A
    每组16进制前面有0可以省略 -> 2001:DB8:0:23:8:800:200C:417A
    特殊情况: 如果计算出的16进制表示形式中有多个0表示的 -> "0位压缩表示法" -> FF01::1101

网络编程-常见命令

 ipconfig: 查看本机IP地址     

                在DOS命令窗口中输入cmd,在光标处输入 ipconfig,敲回车,计算机会打印出相对的
                IP地址。

ping 域名/IP地址

                在DOS命令窗口中输入cmd,  在光标处输入  ping 域名/IP地址,敲回车检查指定域名网
                络是否通常, 还能查看其IP地址

网络编程-Inetaddress类

Inetaddress类作用?
    为了方便我们对IP地址的获取和操作, Inetaddress也表示Internet协议地址(IP地址)

Inetaddress没有对外提供构造方法, 方法有静态和非静态的
    对于这种类, 都会提供一个静态方法返回该类对象,通过对象可以调用该类的方法


常用方法:

static Inetaddress getByName(String host); 获取主机名的IP对象
String getHostName(); 获取主机名
String getHostAddress(); 获取字符串类型的IP地址
public class Demo {
    public static void main(String[] args) throws UnknownHostException {
        //获取主机名的IP对象
        InetAddress address = InetAddress.getByName("Achao");
        System.out.println(address); //Achao/192.168.10.3

        //System.out.println(InetAddress.getByName("哈哈"));
        //java.net.UnknownHostException: 不知道这样的主机

        //分别获取主机名和IP地址
        System.out.println(address.getHostName()); //Achao
        System.out.println(address.getHostAddress()); //192.168.10.3
    }
}

端口

 网络编程三要素: 端口
            应用程序在设备中的唯一标识
    
端口的注意事项:
            1. 端口号用两个字节(整数)表示, 取值范围是0-65535
            2. 其中0-1024的被一些知名的网络服务或者应用占用
            3. 我们自己使用1024-65535之间的即可
            4. 一个端口号只能被一个应用程序使用

    
扩展: 任务管理器中的PID
            任务管理器中的PID(Process Identification)是指进程识别号, 也就是进程标识符
            只要运行一个程序, 程序在内存中即为进程, 操作系统会自动分配一个标识
            它是进程运行时系统随机分配的,并不代表专门的进程, 在运行时PID是不会改变标识符的
            但是当终止程序后再运行PID标识符就会被系统回收, 就可能会被继续分配给新运行的程序

扩展: 如何通过进程PID查询对应端口号
            CMD中输入netstat - nao, 展示当前计算机所有活动连接, 可以查看PID对应的端口号活动
            连接

网络编程三要素-协议

 网络编程三要素: 协议
    计算机网络中, 连接和通信的规则被称为网络"通信协议"
    
网络通信协议的分类
    1. UDP协议: 用户数据报协议, 面向无连接, 速度快,一次最多发送64K, 数据不安全,易丢失 

                     用户数据报协议
(UDP,User Datagram Protocol)是 IP 上层的另一重要协议,它
                     是面向无连接的、不可靠的数据报传输协议。

    2. TCP协议: 传输控制协议, 面向连接, 速度慢没有大小限制, 数据安全
    
网络编程三要素小结
    要素1. IP, 设备在网络中的唯一标识
    要素2. 端口, 应用程序在设备中的唯一标识
    要素3. 协议, 数据在传输过程中遵守的规则

UDP-发送端

 UDP发送步骤:
            1. 创建发送端的 DatagramSocket 对象
            2. 创建数据, 并将数据使用DatagramPacket打包
            3. 调用DatagramSocket的 sent 方法发送数据
            4. 释放资源

public class ClientDemo {
        public static void main(String[] args) throws IOException {
            //1. 创建发送端的DatagramSocket对象
            DatagramSocket ds = new DatagramSocket();

            //2. 创建数据, 并将数据使用DatagramPacket打包
            String message = "你好啊,请问你是?";
            byte[] bytes = message.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 9527;

            //DatagramPacket(字节数组,内容长度,InetAddress对象,端口号)
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);

            //3. 调用DatagramSocket的sent方法发送数据
            ds.send(dp);

            //4. 释放资源
            ds.close();
        }
    }

UDP-接收端

 UDP接收数据步骤:
            1. 创建接收端的 DatagramSocket 对象, 指定接收数据的端口
            2. 创建一个新箱子DatagramPacket, 用于接收数据
            3. 调用DatagramSocket的 receive 方法接收数据, 放入新箱子中
            4. 解析数据包, 将数据展示在控制台
            5. 释放资源
    
注意事项:
            1. 接收端创建DatagramSocket对象需要指定端口, 否则就是随机端口接收数据
            2. 需要先启动接收端, 在运行发送端
            3. 如果启动了接收端, 没有接收到数据, 会死等(阻塞)
            4. 接收到的数据, 可能放不满一个新箱子, 可以只将有效数据打印

public class ServerDemo {
        public static void main(String[] args) throws IOException {
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值