Java网络编程之IP,端口号,通信协议(UDP,TCP)

目录

1.软件架构

C/S:客户端/服务器

在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。

  • 优点:画面精美,用户体验好
  • 缺点:用户需要下载更新
    B/S:浏览器/服务器

只需要一个浏览器,用户通过指定网址访问对应的服务器。

  • 优点:不需要开发客户端,只需要页面+服务端,
    用户不需要下载,打开浏览器就能使用
  • 缺点:如果应用过大,用户体验收到影响

2.网络编程三要素

IP,端口号,网络协议
①IP:设备在网络中的地址,是唯一的标识

全称:Internet Protocol,是互联网协议地址,也称IP地址

是分配给上网设备的数字标签。

②端口号:应用程序在设备中唯一的标识

③协议:数据在网络传输中的规则,常见的协议有:UDP、TCP、HTTP、HTTPS、FTP

3.IP

1.IPV4

①全称:Internet Protocol version 4,互联网通信协议第四版

采用32位地址长度,分成4组

使用点分十进制表示
②IPV4的地址分类形式

  • 公网地址(万维网使用)和私有地址(局域网使用)。
  • 192.168.开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节省IP
    ③特殊ip地址:

本地回环地址127.0.0.1或者localhost,表示本机ip。
④Windows的CMD命令:
ipconfig:查看本机IP地址
ping:检查网络是否连通

2.IPV6

全称:Internet Protocolversion 6,互联网通信协议第六版

由于互联网的蓬勃发展,IP地址的需求量愈来愈大,而IPV4的模式下IP的总数是有限的

采用128位地址长度,分成8组。

使用冒分十六进制表示,特殊情况使用0位压缩表示法。

java 复制代码
        //获取InetAddress的对象
        InetAddress address = InetAddress.getByName("127.0.0.1");

4.端口号

应用程序在设备中唯一的标识。

端口号:由两个字节表示的整数,取值范围:0~65535

其中0~1023之间的端口号用于一些知名的网络服务或者应用

我们自己使用1024以上的端口号就可以了

注:一个端口号只能被一个应用程序使用。

5.协议

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

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广。
  • TCP/IP参考模型(或TCP/IP协议): 事实上的国际标准。

1.UDP协议

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

UDP协议发送数据:

java 复制代码
public class Send{
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();
        //打包数据
        String str = "你好!!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10006;

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
        //发送数据
        ds.send(dp);
        //释放资源
        ds.close();
    }
}

UDP协议接收数据:

java 复制代码
public class Receive{
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象:接收时绑定的端口号要与发送时的端口保持一致
        DatagramSocket ds = new DatagramSocket(10086);
        //接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);
        //解析数据包
        byte[] data = dp.getData();
        int length = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();

        System.out.println("接收到数据:" + new String(data, 0, length));
        System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口号发出的");
        //释放资源
        ds.close();
    }
}

UDP的三种通信方式:单播,组播,广播

1.单播

单播是一种UDP通信的方式,其中一台发送方的计算机向一台接收方的计算机发送数据包。

在单播通信中,发送方和接收方之间是一对一的关系,数据包只会发送到指定的接收方。

单播通信适用于点对点通信或单个目标的广播通信。

2.组播

组播是一种UDP通信的方式,其中一台发送方的计算机可以同时向多个接收方的计算机发送数据包。

在组播通信中,发送方将数据包发送到一个特定的组播IP地址,而不是单独的目标IP地址。

所有加入该组播组的接收方都可以接收到发送方发送的数据包。

组播通信适用于需要同时向多个接收方传输相同数据的场景,如视频会议、多媒体广播等。

使用组播可以有效地减少网络带宽的消耗和系统负载

组播地址: 224.0.0.0 ~ 239.255.255.255

其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址

3.广播

在UDP通信中,广播是一种发送方向局域网中的所有计算机发送数据包的方式。

发送方将数据包发送到广播IP地址,该IP地址被定义为特定的网络地址( 255.255.255.255),表示发送给整个局域网内的所有计算机。

使用广播通信,发送方可以将数据包一次性发送给所有计算机,而无需指定单独的目标IP地址。

所有接收方都可以接收到发送方发送的数据包。

广播通信通常用于向局域网内的所有设备广播信息,例如在局域网内发现其他设备或进行网络设备配置。

2.TCP协议

  • 传输控制协议TCP(Transmission Control Protocol)
  • TCP协议是面向连接的通信协议。
    速度慢,没有大小限制,数据安全
    TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

通信之前要保证连接已经建立

通过Socket产生IO流来进行网络通信

客户端发送数据:

java 复制代码
public class Client {
    public static void main(String[] args) throws IOException {
        //发送数据
        //创建Socket对象
        Socket socket = new Socket("127.0.0.1", 10001);
        //从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        //写出数据
        os.write("你好".getBytes());
        //释放资源
        os.close();
        socket.close();
    }
}

服务器接收数据:

java 复制代码
public class Server {
    public static void main(String[] args) throws IOException {
        //接收数据
        //
        ServerSocket ss = new ServerSocket(10001);
        //监听用户的连接
        Socket socket = ss.accept();
        //从连接通道中获取输入流数据
        InputStream is = socket.getInputStream();
        //解决中文乱码
        InputStreamReader isr = new InputStreamReader(is);
        //使用缓冲流提高读取效率
        BufferedReader br = new BufferedReader(isr);
        int b;
        while ((b = br.read()) != -1) {
            System.out.println((char) b);
        }
        //释放资源
        socket.close();
        ss.close();

    }
}

1.三次握手

确保连接建立:

①客户端向服务器发出连接请求,等待服务器确认。

②服务器向客户端返回一个响应,告诉客户端收到了请求。

③客户端向服务器再次发出确认信息,连接建立。

2.四次挥手

确保连接断开,且数据处理完毕:

①客户端向服务器发出取消连接请求

②服务器向客户端返回一个响应,表示收到客户端取消请求

③服务器将最后的数据处理完毕,服务器向客户端发出确认取消信息

④客户端再次发送确认消息,连接取消

相关推荐
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2342 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch2 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
qq_254674412 小时前
工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置
网络
JokerSZ.2 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
测开小菜鸟3 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity4 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天5 小时前
java的threadlocal为何内存泄漏
java