Java18:网络编程

一.对象序列化:

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();


    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-数组-双指针-中等难度

文章目录 双指针1. 删除有序数组中的重复项(入门)1.1 题目描述1.2 解题思路1.3 代码实现 2. 删除有序数组中的重复项 II(简单)2.1 题目描述2.2 解题思路2.3 代码实现 3. 移动零(简单)3.1 题目描述3.2 代码实…

SpringCloud系列篇:核心组件之网关组件

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.网关组件是什么 二. 网关组件的…

The Sandbox 2024 Game Jam 启动|向博姆库斯博士证明你的游戏开发实力!

The Sandbox Game Jam 是面向所有游戏制作爱好者的创作比赛!我们诚邀您加入 The Sandbox 的生态系统,这里充满活力,游戏与文化相融,创作者彼此切磋,共同实现梦想。唯一能限制您的只有想象力。The Sandbox 游戏由大家共…

控制台项目和ASP.Net Core 1.项目创建 2.一键启动多个服务 3.引入别的库

感悟: 1.注意选择:.NET/.Net Core下面的控制台或者ASP.NET Core web应用,而且只有.net core的项目是跨平台的,选错的话,是无法发布到linux上的。 2.c#的命名空间和java包的区别: c#中是按照包来的&#x…

使用Django框架自带的Form表单完成简单的用户登录注册

如果不知道怎么配置Django环境以及如何连接数据库请点击我的上一篇博客: 使用pycharm初始化Django框架并连接Sql Server 文章目录 1.Django默认生成的数据表2.用户登录2.1创建登录页面2.2视图处理登录请求2.3配置访问路径 3.用户注册3.1创建用户表单3.2创建注册模版…

linux系统基础知识-基础IO

IO 概念引入位图的概念IO的系统调用函数openwriteread()close简单使用样例: 文件描述符fd默认文件流stdin/stdout/stderr文件描述符的分配规则 重定向的概念输出重定向输入重定向追加重定向dup2()系统调用总结 文件缓冲区深入理解缓冲区的概念输出缓冲区部分代码解释…

jmeter循环控制器

1.循环控制器 简单粗暴 写几次 循环几次 经常结合自定义变量使用 2.foreach控制器 搭配 变量一起使用的循环 一般变量的值是一个集合或者 是2个及2个以上的内容

BERT 模型是什么

科学突破很少发生在真空中。相反,它们往往是建立在积累的人类知识之上的阶梯的倒数第二步。要了解 ChatGPT 和 Google Bart 等大型语言模型 (LLM) 的成功,我们需要回到过去并谈论 BERT。 BERT 由 Google 研究人员于 2018 年开发&…

软件测试笔记

文章目录 基础知识1.常见测试分类2.质量模型3.测试流程4.用例5.等价类6.边界值分析方法7.判定表8.流程图9.场景法10.错误推测法11.缺陷12.缺陷编写13.缺陷管理工具注:内容和图片来自黑马程序员视频。 基础知识 1.常见测试分类 按阶段划分 (1)单元测试&#xff1a…

详解java继承

目录 一 、为什么需要继承 二、准备工作:用java代码先定义狗类、猫类、动物类,这是代码准备如下 三、继承代码实现 四、 子类中访问父类的成员方法 4.1. 成员方法名字不同 4.2 成员方法名字相同 五、子类构造方法 扩展:如果你对子类和…

手撕 PCA

PCA(Principal Component Analysis),中文名称:主成分分析。迄今为止最流行的降维算法。 假设 n 维空间中的一个单位立方体,易知:一维空间中该立方体中任意两点的距离不超过 1 1 1,二维空间中该…

系列十四、while do...while switch模板代码

一、while & do...while & switch模板代码 1.1、while /*** 需求&#xff1a;使用while循环打印5遍Hello World!*/ Test public void print5() {int i 1;while (i < 5) {System.out.println("Hello World! " LocalDateTime.now());// 线程休眠&#x…

批量置入视频封面:一分钟教程,简单易学

在视频制作过程中&#xff0c;为视频添加引人注目的封面是吸引观众的关键。而当我们需要批量处理多个视频时&#xff0c;如何快速、准确地置入封面就显得尤为重要。本文将为您揭示这一高效技巧&#xff0c;让您在一分钟内学会批量置入视频封面&#xff0c;提升视频的吸引力与观…

GEC6818 智能语音家居系统——原神主题的平板

GEC6818 智能语音家居系统——原神主题的平板 文章目录 GEC6818 智能语音家居系统——原神主题的平板一、 滑动解锁密码解锁二、 在桌面有两种方式可以进行选择2.1 普通点击模式2.1.1 电子相册2.1.2 监控2.1.3 画板2.1.4 视频播放2.1.5 五子棋小游戏2.1.6 烟雾传感器GY39RFID 2…

独家原创:“ARO算法的再进化,BMARO的创新改进与卓越表现“

人工兔优化算法ARO作为一种近期比较好的优化算法&#xff0c;深受人们和编辑的喜爱。 人工兔优化算法&#xff08;Artificial Rabbit Optimization, ARO&#xff09;是一种基于自然界兔子行为的启发式优化算法。该算法通过模拟兔子在寻找食物和规遍领地时的智能行为&#xff0…

Java药物不良反应ADR智能监测系统源码

药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用方式、个体差异等因素而异&#xff0c;可能导致患者身体不适、病情恶化。 为保…

Linux shell jq工具操作文档(jq --help使用示例)

文章目录 jq工具介绍jq --help解读英文中文 使用示例1. 使用最简单的过滤器。将输入复制到输出&#xff0c;不做任何修改&#xff08;除了格式化&#xff09;2. 使用 -c 选项进行紧凑输出而非美化输出3. 使用 -n 选项以 null 作为单一输入值&#xff08;用于创建新json&#xf…

podman configure insecure certificate registry【podman 设置非安全镜像仓库】

预备条件 docker registry仓库私搭并配置证书centos 7.9 部署 harbor 镜像仓库实践harbor 部署入门指南Podman 部署私有镜像仓库 设置 $ vim /etc/hosts 192.168.23.47 registry.ghostwritten.com$ vim /etc/containers/registries.conf ... [[registry]] location "r…

网工内推 | 运维工程师,国企、上市公司,RHCE认证优先

01 广东机场白云信息科技股份有限公司 招聘岗位&#xff1a;基础架构运维工程师&#xff08;中级&#xff09; 职责描述&#xff1a; 1、参与公司业务系统的监控、巡检、维护、故障定位、原因分析&#xff1b; 2、负责业务系统的上线、升级割接工作&#xff1b; 3、负责服务器…