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

相关推荐
Mr.朱鹏34 分钟前
Nginx路由转发案例实战
java·运维·spring boot·nginx·spring·intellij-idea·jetty
Cisco_hw_zte2 小时前
小型网络中部署Aruba无线
网络
白露与泡影2 小时前
2026版Java架构师面试题及答案整理汇总
java·开发语言
历程里程碑2 小时前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
qq_229058013 小时前
docker中检测进程的内存使用量
java·docker·容器
我真的是大笨蛋3 小时前
InnoDB行级锁解析
java·数据库·sql·mysql·性能优化·数据库开发
钦拆大仁3 小时前
Java设计模式-单例模式
java·单例模式·设计模式
小手cool3 小时前
在保持数组中对应元素(包括负数和正数)各自组内顺序不变的情况下,交换数组中对应的负数和正数元素
java
笨手笨脚の3 小时前
深入理解 Java 虚拟机-04 垃圾收集器
java·jvm·垃圾收集器·垃圾回收
skywalker_113 小时前
Java中异常
java·开发语言·异常