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

相关推荐
弹简特1 天前
【JavaEE06-后端部分】SpringMVC01-Spring MVC第一大核心URL 路由映射【建立连接】与 Postman 接口测试详解
java·spring boot·测试工具·spring·postman
rannn_1111 天前
【苍穹外卖|Day3】公共字段自动填充、新增菜品功能、菜品分页查询功能、删除菜品功能、修改菜品功能、起售停售菜品
java·spring boot·后端·学习·项目
我真会写代码1 天前
WebSocket:告别轮询,实现Web实时通信 WebRTC:无需插件,实现浏览器端实时音视频通信
网络·websocket·网络协议·webrtc·实时音视频
无名-CODING1 天前
SpringMVC处理流程完全指南:从请求到响应的完整旅程
java·后端·spring
瑶山1 天前
Spring Cloud微服务搭建三、分布式任务调度XXL-JOB
java·spring cloud·微服务·xxljob
only_Klein1 天前
kubernetes Pod 通信过程演示
网络·kubernetes·tcpdump
以太浮标1 天前
华为eNSP模拟器综合实验之- DHCP Option 43 解析
服务器·网络·华为·云计算
Re.不晚1 天前
深入底层理解HashMap——妙哉妙哉的结构!!
java·哈希算法
智算菩萨1 天前
【网络工程师入门】DNS域名系统的深度解读与实践应用指南
网络·网络协议·系统架构
Serene_Dream1 天前
Java 内存区域
java·jvm