2025/11/19 网络编程

网络编程

什么是网络编程?

**网络编程:**在网络通信协议下,不同计算机上运行的程序,进行的数据传输

计算机与计算机之间通过网络进行数据传输

java中可以使用java.net包下的技术开发常见的网络应用程序

常见的软件架构(C/S、B/S)

**C/S:**Client/Server 客户端/服务器

优点:画面可用做的非常精美,用户体验好

缺点:需要开发客户端,也需要开发服务端

用户需要下载核更新的时候太麻烦

通过客户端访问服务器

**B/S:**Browser/server 浏览器/服务器

通过浏览器访问服务器

**优点:**不需要开发客户端,只需要页面+服务端

用户不需要下载,打开浏览器就能用

缺点:如果应用过大,用户体验受到影响

总结

网络编程三要素

**IP:**设备在网络中的地址,是唯一的标识

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

**协议:**数据在网络中的传输规则,常见的协议有UDP、TCP、http、https、ftp

IP(Internet Protocol),互联网协议地址,也称IP地址

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

上网设备在网络中的地址,是唯一的

**IPv4:**Internet Protocol version 4 ,互联网通信协议第四版

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

**IPv6:**Internet Protocol version 6 ,互联网通信协议第六版

IPv4的地址分类形式

公网地址(万维网使用)和私有地址(局域网使用)

特殊IP地址

不一样

常用的CMD命令:

**ipconfig:**查看本机IP地址

**ping:**检查网络是否畅通

InetAddress的使用

java 复制代码
package com.itheima.a01InetAddressdemo;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyInetAddressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
       //1、获取InetAddress的对象
        //IP的对象 一台电脑的对象
        InetAddress address = InetAddress.getByName("DESKTOP-UA5S79S");
        System.out.println(address);
        //获取电脑的主机名
        String name = address.getHostName();
        System.out.println(name);
        //获取电脑的IP地址
        String ip = address.getHostAddress();
        System.out.println(ip);
    }
}

端口号

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

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

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

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

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

协议

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

OSI参考模型(太过理想,未能广泛推广)

TCP/IP参考模型(TCP/IP协议)(国际标准)

UDP协议

用户数据报协议(User Datagram Protocol)

面向无连接通信协议

速度快,有大小限制,一次最多发送64K,数据不安全,容易丢失数据

不管是否连接成功,直接发送

UDP通信程序(发送数据)

1)创建发送端的 DatagramSocket对象

2)数据打包 DatagramPacket

3)发送数据

4)释放资源

java 复制代码
package com.itheima.a02udpdemo;

import java.io.IOException;
import java.net.*;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //细节:绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();
        //打包数据
        String str = "你好呀!";
        //将字符串转换为字节数组
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        //创建DatagramPacket对象
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        //发送数据
        ds.send(dp);
        //关闭资源
        ds.close();
    }
}
UDP通信程序(接收数据)

1)创建接收端的 DatagramSocket对象

2)接收打包好的数据

3)解析数据包

4)释放资源

java 复制代码
package com.itheima.a02udpdemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //细节:接收的时候,一定要绑定端口
        //而且绑定的端口号,要和发送端绑定的端口号一致
        DatagramSocket ds = new DatagramSocket(10086);
        //接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);
        //解析数据包
        int length = dp.getLength();
        byte[] data = dp.getData();
        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)单播

以前的代码就是单播

2)组播

组播地址:224.0.0.0~239.255.255.255

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

3)广播

广播地址;255.255.255.255

TCP协议

传输控制协议TCP(Transmission Control Protocol)

面向连接的通信协议

速度慢,没有大小限制,数据安全

TCP通信程序

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

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

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

java 复制代码
package com.itheima.a02tcpdemo1;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        //TCP协议,发送数据
        //创建Socket对象
        //细节:在创建对象的同时会连接服务器
        //如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1", 10001);
        //从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        //写出数据
        os.write("aaa".getBytes());
        //释放资源
        os.close();
        socket.close();
    }
}
java 复制代码
package com.itheima.a02tcpdemo1;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //TCP协议,接收数据
        //创建对象
        ServerSocket ss = new ServerSocket(10001);
        //监听客户端连接
        Socket socket = ss.accept();
        //从连接通道中获取输入流
        InputStream is = socket.getInputStream();
        int b;
        while((b = is.read()) != -1){
            System.out.print((char)b);
        }
        //释放资源
        socket.close();
        ss.close();

    }
}

在这种情况下,只能发送英文,发送中文的话会出现乱码现象

如何解决:

提高读取效率

TCP通信程序(三次握手)

确保连接建立

TCP通信程序(四次挥手)

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

相关推荐
郑州光合科技余经理1 小时前
开发指南:海外版外卖跑腿系统源码解析与定制
java·开发语言·mysql·spring cloud·uni-app·php·深度优先
J***Q2921 小时前
Docker镜像多平台构建
运维·docker·容器
c***97981 小时前
Docker音频处理案例
运维·docker·容器
SuperherRo1 小时前
JAVA攻防-反序列化利用&JNDI注入&高版本绕过&依赖Jar包&gadge包链&自动Bypass
java·反序列化·jndi·高版本绕过
大锦终2 小时前
【Linux】Reactor
linux·运维·服务器·c++
智语言2 小时前
SpringBoot实战一:五分钟创建第一个Web应用
java
星释2 小时前
Rust 练习册 44:Trait 中的同名函数调用
开发语言·后端·rust
fanruitian2 小时前
Java 静态代码块
java·开发语言
IUGEI2 小时前
【后端开发笔记】JVM底层原理-垃圾回收篇
java·jvm·笔记·后端