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对象获取输入输出流,收发数据

相关推荐
Flittly14 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了14 小时前
Java 生成二维码解决方案
java·后端
人活一口气19 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP21 小时前
Vibe Coding -- 完整项目案例实操
java
荣码21 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing21 小时前
Google第三方授权登录
java·后端·程序员
明月光81821 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路1 天前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java