Java基础2.6-网络编程

目录

网络编程基本概念

基本的通信架构

网络编程三要素

IP地址

IPV4

IPV6

[IPv4 的地址分类形式](#IPv4 的地址分类形式)

特殊IP地址

常用的CMD命令

IP和网址

InetAddress对象

端口号

协议

[UDP 协议收发数据](#UDP 协议收发数据)

UDP协议发送数据

[TCP 协议收发数据](#TCP 协议收发数据)


网络编程基本概念

可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信)。

基本的通信架构

基本的通信架构有2种形式:CS架构( Client客户端/Server服务端 ) 、 BS架构(Browser浏览器/Server服务端)。

网络编程三要素

IP地址

IPV4

IPV6

IP 的作用

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

IPv4 有什么特点

目前的主流方案

最多只有2^32次方个ip,目前已经用完了

IPv6有什么特点

为了解决IPv4不够用而出现的

最多有2^128次方个ip

可以为地球上的每一粒沙子都设定ip

IPv4 的地址分类形式

IPv4 的地址分类形式

特殊IP地址

常用的CMD命令

ipconfig:查看本机IP地址

ping:检查网络是否连通

现在如何解决IPv4不够的问题?

利用局域网IP解决IP不够的问题

特殊的IP是什么?

127.0.0.1(永远表示本机)

常见的两个CMD命令?

ipconfig:查看本机IP地址

ping:检查网络是否连通

IP和网址

InetAddress对象

为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用

InetAddress:此类表示Internet协议(IP)地址。

|-------------------------------------------|-----------------------------------|
| 方法名 | 说明 |
| static InetAddress getByName(String host) | 确定主机名称的IP地址。 主机名称可以是机器名称,也可以是IP地址 |
| String getHostName() | 获取此 IP 地址的主机名 |
| String getHostAddress() | 返回文本显示中的 IP 地址字符串 |

端口号

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

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

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

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

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

协议

UDP 协议收发数据

UDP是面向无连接通信协议。

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

UDP协议发送数据

复制代码
package com.itheima.udp;

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

public class Receive {
    public static void main(String[] args) throws IOException   {
        //创建接受对象
        DatagramSocket socket = new DatagramSocket(9999);
        //准备接受端的包裹对象
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
        //接受数据
        socket.receive(packet);
        //拆包
        byte[] data = packet.getData();
        String s = new String(data,0, packet.getLength());
        String hostAddress = packet.getAddress().getHostAddress();
        System.out.println("接收到"+hostAddress+"发送的数据"+s);
    }
}

package com.itheima.udp;

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

public class Send {
    public static void main(String[] args) throws IOException {
        //创建发送端的datagramSocket 端数据  发送端
        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据
        String msg ="你好";
        byte[] bytes = msg.getBytes();
        //打包数据
        DatagramPacket pak = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 9999);
        //发送数据
        socket.send(pak);
        //释放资源
        socket.close();
    }
}

UDP协议收发数据

使用 DatagramSocket 搭建站点

使用 DatagramPacket 打包数据

send 方法用于发送

receive 方法用于接收

TCP 协议收发数据

复制代码
package com.itheima.tcp;

import javax.imageio.stream.FileImageInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        //使用file对象封装要上传的文件
        File file = new File("D:\\2.jpg");
        //1,创建客户端的站点和服务端指定ip和端口
        Socket socket = new Socket("localhost", 8899);
        //客户端通过socket获取传输数据的输入输出流
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        //客户端创建本地流对象 读取要上传的数据
        FileImageInputStream fis = new FileImageInputStream(file);
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fis.read(bytes))!=-1){
            //重点:将读取到的字符 通过网络流对象写给服务器端
            os.write(bytes,0,len);
        }
        //客户端给服务端结束的标记
        socket.shutdownOutput();
        fis.close();
        //读取服务端发来的消息
        byte[] data = new byte[1024];
        int dataLength = is.read(data);
        String msg = new String(data, 0, dataLength);
        System.out.println("读取到的数据"+msg);
        //关闭流
        is.close();
        os.close();
        socket.close();
    }
}

package com.itheima.tcp;

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

public class Server {
    public static void main(String[] args) throws IOException {
        //1,serverSocket
        ServerSocket serverSocket = new ServerSocket(8899);
        System.out.println("服务器开始 等待客户端连接......");
        //响应客户端请求发送的数据
        Socket scoket = serverSocket.accept();
        System.out.println("响应成功");

        //服务器端通过socket获取传输数据的输入输出流
        InputStream inputStream = scoket.getInputStream();
        OutputStream outputStream = scoket.getOutputStream();
        //本地字输出流
        FileOutputStream fos = new FileOutputStream("E://result.jpg");
        //读取客户端发过来的文件(图片文字)
        byte[] buffer = new byte[1024];
        int len ;
        while ((len = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        fos.close();
        //5,写出上传成功的消息给客户端
        outputStream.write("上传成功".getBytes());
        //关闭流
        inputStream.close();
        outputStream.close();
        serverSocket.close();

    }
}

TCP 协议是 面向连接 的通信协议

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

通过三次握手建立连接

通过四次挥手断开连接

TCP 协议区分客户端和服务端

客户端创建 Socket 对象,指定IP和端口号

服务端创建 ServerSocket 对象,指定端口号

调用accept相应请求,得到Socket对象

两端通过socket对象获取输入输出流,收发数据

相关推荐
程序员清风15 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55116 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊1 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing1 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家2 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺2 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602732 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端