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

相关推荐
独行soc1 分钟前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
EmbedLinX4 分钟前
嵌入式之协议解析
linux·网络·c++·笔记·学习
考琪6 分钟前
Nginx打印变量到log方法
java·运维·nginx
凉、介7 分钟前
VMware 三种网络模式(桥接 / NAT / Host-Only)原理与实验解析
c语言·网络·笔记·操作系统·嵌入式·vmware
Aliex_git16 分钟前
跨域请求笔记
前端·网络·笔记·学习
wangjialelele17 分钟前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑18 分钟前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
晔子yy28 分钟前
如何设计让你的程序同时处理10w条数据
java
Yvonne爱编码34 分钟前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
lpfasd12338 分钟前
物联网后端岗位java面试题
java·物联网·php