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通信程序(四次挥手)

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

相关推荐
聆风吟º12 小时前
CANN开源项目深度实践:基于amct-toolkit实现自动化模型量化与精度保障策略
运维·开源·自动化·cann
侠客行031714 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪14 小时前
深入浅出LangChain4J
java·langchain·llm
较劲男子汉15 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
灰子学技术15 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚15 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
wypywyp16 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎16 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰16 小时前
[python]-AI大模型
开发语言·人工智能·python
Doro再努力16 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim