Java18:网络编程

news2025/1/16 18:46:40

一.对象序列化:

1.对象流:

ObjectInputStream 和 ObjectOutputStream

2.作用:

ObjectOutputSteam:内存中的对象-->存储中的文件,通过网络传输出去
ObjectInputStream:存储中的文件,通过网络传输出去-->内存中的对象

3.对象的序列化机制:

对象序列化机制允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另外一个网络节点。//当其他程序获取了这种二进制流,就可以恢复成原来的java对象

4.序列化和反序列化过程:

代码实现:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    //创建对象流
    ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("object.txt"));
    //字符串序列化
    oos.writeObject("北京欢迎你!");
    oos.flush();
    System.out.println("***************************************");
    //对象序列化
    Person p  = new Person("tom",20);
    oos.writeObject(p);
    oos.flush();
    oos.close();
    System.out.println("***************************************");
    //反序列化:把对象从文件或数据库中读取到内存中
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
    Object o = ois.readObject();
    System.out.println(o);
    Object o1 = ois.readObject();
    System.out.println(o1);
    ois.close();
}

5.实现序列化的对象所属的类需要满足:

1)需要实现接口:Serializable

2)当前类提供一个全局常量:SerialVersionUid

3)除了当前类需要实现Serializable接口之外,还需要保证其内部所有属性也必须是可序列化的

补充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

二.随机存取文件流:

1.随机存取文件流:RandomAccessFile

2.使用说明:

1)RandomAccessFile直接继承于java.lang.Object类,实现了数据读取和输出

2)RandomAccessFile即可以是输入流又可以是输出流

3)RandomAccessFile作为输出流时,写出文件如果不存在,则在执行过程中自动创建,

如果写出的文件存在,则会对原文件内容进行覆盖

4)可以通过相关的操作,实现RandomAccessFile"插入"数据的效果。seek(int pos)

3.典型代码:

@Test
public void test() throws IOException {
    RandomAccessFile acf1 = new RandomAccessFile("cat.jpg", "r");
    RandomAccessFile acf2 = new RandomAccessFile("cat3.jpg", "rw");
    byte[] bute = new byte[1024];
    int len;
    while ((len = acf1.read(bute)) != -1) {
        acf2.write(bute, 0, len);
    }
    acf1.close();
    acf2.close();

}

@Test
public void test2() throws IOException {
    RandomAccessFile acf1 = new RandomAccessFile("hello1.txt", "rw");
    acf1.seek(3);
    acf1.write("xyz".getBytes());
    acf1.close();

}

@Test
public void test3() throws IOException {
    /*
    使用  RandomAccessFile 实现插入功能
     */

    RandomAccessFile acf1 = new RandomAccessFile("h.txt", "rw");
    acf1.seek(3);
    StringBuilder sb  = new StringBuilder((int)new File("h.txt").length());
    //把剩余内容存到StringBuilder对象
    byte[] bute = new byte[1024];
    int len;
    while ((len = acf1.read(bute)) != -1) {
        sb.append(new String(bute,0,len));
    }
    //把指针从写指到3
    acf1.seek(3);
    acf1.write("xyz".getBytes());
    acf1.write(sb.toString().getBytes());
    acf1.close();

}

三.网络传输:

1.实现网络通信需要解决的两个问题

1)如何准确地定位网络上一台或多台主机:定位主机上的特定应用

2)找到主机后如何可靠高效地进行数据传输

2.网络通信的两个要素:

1)对应问题一:ip和端口号

2)对应问题二:提供网络通信协议:TCP/IP参考模型(应用层,传输层,网络层,物理+数据链路层)

3.通信要素一:ip和端口号

1)ip的理解

》ip:唯一标识Internet上计算机(通信实体)

》在java 中使用InetAddress类代表ip

》ip分类:ipv4和ipv6 ;万维网和局域网

》域名:www.baidu.com  ,www.jd.com

2)InetAddress类:

2.1 实例化

getByName(String host),getLocalHost()

2.2 常用方法

getHostName() /getHostAddress()

3.端口号:正在计算机上运行的进程

要求:不同的进程不同的端口号

范围:被规定为一个正整数 0-65535

端口号与ip地址组合得出一个网络套接字:Socket

4.通信要素二:网络通信协议:

1)分类模型

2)TCP和UDP的区别

TCP协议:使用协议前建立TCP连接,形成传输通道,传输前使用三次握手方式,点对点通信,是可靠的;在连接中可进行大数据量的传输;传输完毕,需释放已建立的连接,效率低

UDP协议:将数据,源,目的封装成数据包,不需要建立连接,每个数据报的大小限制在64k内;

发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;可以广播发送;发送数据结束时,无需释放资源,开销小,速度快

5.代码实例:

1)IP地址代码实例:

public class InetAddressTest {
    public static void main(String[] args) throws UnknownHostException {

        //根据ip地址创建ip地址对象
        InetAddress ina1 =InetAddress.getByName("192.168.1.1");
        System.out.println(ina1);
        //根据域名创建ip地址对象
        InetAddress ina2= InetAddress.getByName("www.baidu.com");
        System.out.println(ina2);
        byte[] address = ina1.getAddress();
        System.out.println(ina1.getHostName());
        System.out.println(ina1.getHostAddress());
        System.out.println(ina2.getHostName());
        System.out.println(ina2.getHostAddress());
    }
}

2)TCP代码实例:

public class Tcp1Test {
//发送信息
    @Test
    public void test() throws IOException {
       Socket  clent = new Socket(InetAddress.getByName("127.0.0.1"),8899);
        OutputStream outputStream = clent.getOutputStream();
        outputStream.write("我是客户端".getBytes());
        outputStream.close();
        clent.close();



    }

    @Test
    public void test2() throws IOException {

    ServerSocket  server  =new ServerSocket(8899);
        Socket accept = server.accept();
        InputStream inputStream = accept.getInputStream();
        ByteArrayOutputStream byteout =new ByteArrayOutputStream();
        byte[] buffer =new byte[20];
        int len;
        while((len=inputStream.read(buffer))!=-1){
            byteout.write(buffer,0,len);
            System.out.println(byteout.toString());
        }

         server.close();
        inputStream.close();
        byteout.close();

    }

}
public class Tcp2Test {

  //发送文件
    @Test
    public void test1() throws IOException {
        InetAddress  inet= InetAddress.getByName("127.0.0.1");
        Socket clent =new Socket(inet,8851);
        OutputStream outputStream = clent.getOutputStream();
        FileInputStream fis= new FileInputStream("leaf.jpg");
        byte[] buffer= new byte[10];
        int len;
        while((len=fis.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }
        fis.close();
        outputStream.close();
        clent.close();





    }

    @Test
    public  void  test2() throws IOException {
        ServerSocket server =new ServerSocket(8851);
        Socket accept = server.accept();
        InputStream inputStream = accept.getInputStream();
        FileOutputStream fos=new FileOutputStream("leaf2.jpg");
        byte[] bufferr = new byte[10];
        int len;
        while((len=inputStream.read(bufferr))!=-1){
            fos.write(bufferr,0,len);
        }
        fos.close();
        inputStream.close();
        server.close();



    }

}
public class Tcp3Test {
    //发送文件,服务器返回信息
    @Test
    public void test() throws IOException {

        InetAddress   inet = InetAddress.getByName("127.0.0.1");
        Socket  client  =new Socket(inet,7788);
        OutputStream outputStream = client.getOutputStream();
        //从本地读取文件并发送到服务器
        FileInputStream fis =new FileInputStream("leaf.jpg");
        byte[] buffer =new byte[20];
        int len;
        while((len=fis.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }
        //关闭数据输出
        client.shutdownOutput();
        //接受服务器发送的信息,并输出到控制台
        InputStream inputStream = client.getInputStream();
        ByteArrayOutputStream bos =new ByteArrayOutputStream();
        byte[] bu =new byte[20];
         int len1;
         while((len1=inputStream.read(bu))!=-1){
             bos.write(bu,0,len1);
         }
        System.out.println(bos.toString());

        fis.close();
        outputStream.close();
        client.close();


    }
    @Test
    public void test2() throws IOException {
        ServerSocket server = new ServerSocket(7788);
        Socket accept = server.accept();
        InputStream inputStream = accept.getInputStream();
        //接受客户端发送文件并存到本地
      FileOutputStream  fos= new FileOutputStream("leaf3.jpg");
        byte[] buff =new byte[20];
        int len;
        while((len=inputStream.read(buff))!=-1){
            fos.write(buff,0,len);
        }
        //给客户端发送已接收消息
        OutputStream outputStream = accept.getOutputStream();
        outputStream.write("图片已收到,谢谢".getBytes());

        fos.close();
        inputStream.close();
        server.close();
        outputStream.close();
    }

}

3)UDP代码实例:

public class UdpTest {



    @Test
    public  void test() throws IOException {
        //发送端
        DatagramSocket socket =new DatagramSocket();

        InetAddress inet =InetAddress.getLocalHost();
        String str="我是udp方式发送的数据";
        byte[] buff = str.getBytes();
        DatagramPacket  packet =new DatagramPacket(buff,0,buff.length,inet,8890);
        socket.send(packet);
        socket.close();


    }

    @Test
    public void test2() throws IOException {

        //接收者
        DatagramSocket  socket =new DatagramSocket(8890);
        byte[] buffer =new byte[100];
        DatagramPacket packet =new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));

    }
}

4)URL代码实例:

public class UrlTest {
    @Test
    public void test() throws MalformedURLException {
         //获取url对象
        URL url =new URL("http://localhost:8080/examples/leaf.jpg");

        //url 主要方法
        System.out.println(url.getProtocol());//获取协议
        System.out.println(url.getHost());//获取主机
        System.out.println(url.getPort());//获取端口
        System.out.println(url.getQuery());//获取查询内容



    }
    @Test
    public void test2() throws IOException {
 //服务器下载图片
URL url =new URL("http://localhost:8080/examples/leaf.jpg");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.connect();
        InputStream inputStream = urlConnection.getInputStream();
        byte[] buffer =new byte[20];
        int len;
        FileOutputStream fos =new FileOutputStream("leafdown.jpg");
        while((len=inputStream.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }

        inputStream.close();
        fos.close();
        urlConnection.disconnect();


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

状态管理小能手:Cookie 和 Session

1. 引言 大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 假期抢票的尴尬事件 最近小❤在抢出行的高铁票时,发生了一件尴尬的事情。 这不是临近假期了嘛&#xf…

【数字图像处理】水平翻转、垂直翻转

图像翻转是常见的数字图像处理方式,分为水平翻转和垂直翻转。本文主要介绍 FPGA 实现图像翻转的基本思路,以及使用紫光同创 PGL22G 开发板实现数字图像水平翻转、垂直翻转的过程。 目录 1 水平翻转与垂直翻转 2 FPGA 布署与实现 2.1 功能与指标定义 …

SSM 基础知识点

1. IoC IoC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在 Java 开发中,IoC 意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 谁控制谁,控制什么&…

Linux网络配置

一、查看网络配置 1、查看网络接口信息ifconfig 1.查看所有活动的网络接口信息 2.查看指定网络接口信息 ifconfig 网络接口 ifconfig -a #显示所有活动及非活动的连接 ifconfig网络接口 ifconfig -a #显示所有活动及非活动的连接 主机的网络接口卡(网卡)通常称为网络接口…

QT上位机开发(动态添加控件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 开发界面的时候,大多数情况下,我们都是推荐优先使用designer来进行界面开发。但凡事总有例外,如果控件本身数量…

C#编程-实现在文本文件中的读和写

实现在文本文件中的读和写 Stream类用于从文本文件读取数据和向文本文件写入数据。它是一个抽象类,支持向流读写字节。如果文件的数据仅是文本,那么您可以使用StreamReader类和StreamWriter类来完成相应的读和写任务。 StreamReader类 StreamReader类继承自从抽象类TextRea…

扩展边界opencv

扩展图像的边缘(如上边增加50像素)通常是通过添加额外的像素行来实现的 使用cv2.copyMakeBorder函数 valueborder_color指定了边框的颜色 import cv2 import numpy as np# 读取图像 image cv2.imread(th.jpg)# 设置边框宽度 top_border_width 50 # …

三、nginx代理功能

目录 SQUID代理服务器配置安装squid编辑squid配置文件 定义拒绝访问启动squid服务 linux客户端配置linux客户端配置正向代理测试http代理服务器上查看日志/var/log/squid/access.log windows 也可以配置网页代理 SQUID代理服务器配置 安装squid yum install squid -y 编辑squ…

Hive基础知识(六):Hive 配置运行日志信息、打印当前库和表头、参数配置方式

1. Hive 运行日志信息配置 1)Hive 的 log 默认存放在/tmp/atguigu/hive.log 目录下(当前用户名下) 2)修改 hive 的 log 存放日志到/opt/module/hive/logs (1)修改/opt/module/hive/conf/hive-log4j2.prop…

【GNN 1】PyG实现图神经网络,完成节点分类任务,人话、保姆级教程

我们来做一个节点分类的任务,选择的数据集是Karate Club,Karate是空手道的意思,所以这就是一个空手道俱乐部的数据。 简而言之,这个数据集,包含34个节点,156条无向无权边,结点总共分为4类&…

AI绘画:Midjournety的使用体验

今天的时间少,没有给大家做一些教程,就单纯分享使用体验,还不错,体验感很好。 后需如果有需要,我可以出一些教程类的视频。 下面是一组复刻fated的saber的一组提示词,效果相当不错。我后续会分享一些学习经…

uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题

需求:要在app上的顶部导航提示哪里添加一些东西进去,用uniapp自带的肯定不行啊,所以自定义了所有的页面的顶部导航,之后自定义后用手机调试发现 uni.getMenuButtonBoundingClientRect()这个方法的top获取不到....网上找了很多种方…

基于 InternLM 和 LangChain 搭建你的知识库

基于 InternLM 和 LangChain 搭建你的知识库 大模型开发范式LLM的局限性:RAG 检索增强生成 LangChain简介构建向量数据库搭建知识库助手Web Demo部署环境配置下载 NLTK 相关资源下载本项目代码 大模型开发范式 LLM的局限性: 知识实效性受限&#xff1a…

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤: //1.创建 模型(这里是数据模型!) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型!) ui->tableView->setModel(tabModel); 模型种类: QStringListModel…

vue element plus Typography 排版

我们对字体进行统一规范,力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

了解不同方式导入导出的速度之快

目录 一、用工具导出导入 Navicat(速度慢) 1.1、导入: 共耗时: 1.2、导出表 共耗时: 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时: 只导出表结构 导入 共耗时&…

Linux 网络层收发包流程及 Netfilter 框架浅析

1. 前言 本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简单阐述。 内容如有理解错误而导致说明错误的地方,还请指正。如存在引用而没有添…

怎样的摆渡系统,能实现安全可管控的跨网数据传输?

大数据时代,数据在流通与传输的过程中,更需要注意到数据的安全防护,护航数据价值。“让数据主宰一切的隐忧”,数字战争的时代,各国早已认识到网络安全愈发重要,数据也成为各国发展的重要武器。 出于安全性和…

vmware虚拟机内存异常占用问题一例

关键词 vmware esxi、hypervisor虚拟化平台内存模式 Guest virtual memory 一、问题现象 业务一台vmware虚拟机出现内存使用率告警,运维人员登录系统检查内存确实高水位状态 检查各进程使用内存不高,合计内存总数与使用率占用情况明显不匹配&#xf…