返回顶部
首页 > 资讯 > 精选 >Java中通过数据报包输送对象的方法是什么
  • 381
分享到

Java中通过数据报包输送对象的方法是什么

2023-06-03 03:06:38 381人浏览 八月长安
摘要

这篇文章主要介绍“Java中通过数据报包输送对象的方法是什么”,在日常操作中,相信很多人在Java中通过数据报包输送对象的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中通过数据报包输送对象

这篇文章主要介绍“Java中通过数据报包输送对象的方法是什么”,在日常操作中,相信很多人在Java中通过数据报包输送对象的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中通过数据报包输送对象的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java 1.1 吸引人的特性之一就是新增了 objectInputStreamObjectOutputStream 这两个类。有了这个新的 apiObjectOutputStream 类中的 writeObject(Object o) 方法和 ObjectInputStream 类中的 object readObject()),您就可以随时获取运行对象的快照,而不管它的对象图有多复杂。因为这种快照是通过 ObjectOutputStream 类(OutputStream 类的子类)提供的,所以您很容易将它包装在其他输出流中,从而实现所需的任何功能(如 FileOutputStream)。

Java 1.1 中提供的这些新类使得在网上传输运行对象成为可能。为此,该对象以及那些被引用的对象必须可序列化 -- 即能够转换为字节流。幸运的是,在 Java 1.1 中,多数内建的类都是可序列化的。但是,某些类是不可序列化的(Object 类就是一个典型的例子)。不过别担心。如果您的类继承自不可序列化的类,您还可以用 ObjectOutputStream 类中的 defaultWriteObject() 方法实现序列化,随后还可用 ObjectInputStream 类中的 defaultReadObject() 方法解除序列化。

一旦进行了序列化,对象就可在网上传输了。以下示例说明生成可序列化对象并通过流套接字发送它的方法:

//对象输出
import java.net.*;
import java.io.*;

//要发送的类样例:Factory
class Factory implements Serializable
{
 private void writeObject(ObjectOutputStream out) throws IOException
 {
 out.defaultWriteObject();
 }

 private void readObject(ObjectInputStream in)
 throws IOException, ClassNotFoundException
 {
 in.defaultReadObject();
 }
}

public class ShowObjOutput
{
 public static void main(String[] arg)
 {
 try
 {
 ObjectOutputStream os;
 Socket sock = new Socket("panda.cs.uno.edu", 6000); //panda 为主机名
 Factory fa = new Factory();

 os = new ObjectOutputStream( new
 BufferedOutputStream(sock.getOutputStream()));
 os.writeObject(fa);
 }
 catch (IOException ex)
 {}
 }
}

下一示例说明了 ObjectInputStream 如何从流套接字接收对象:

//对象输入
import java.net.*;
import java.io.*;

public class ShowObjInput
{
 public static void main(String[] arg)
 {
 try
 {
 ObjectInputStream is;
 ServerSocket servSock = new ServerSocket(6000);
 Sock sock;

 sock = servSock.accept();
 is = new ObjectInputStream( new
 BufferedInputStream(sock.getInputStream()));
 Factory o = (Factory)is.readObject();
 }
 catch (IOException ex)
 {}
 }
}

除了紧密耦合的套接字之外,Java 还提供了 DatagramSocket 类来支持无连接的数据报通信。我们可以使用数据报通信完成对象输入/输出吗?完成此功能不象使用流套接字那么简单?问题在于 DatagramSocket 未连接到任何流;为了执行发送和接收操作,DatagramSocket 使用一个字节数组作为参数。

可以想像,为了构造数据报包,对象必须转换成字节数组。如果对象涉及到一个复杂的对象图,这种转换可能极难完成。以前发表的许多文章讨论了实现对象序列化的方法 -- 即将 Java 对象打包(序列化)成字节流以及将字节流解包为 Java 对象。然而,由于对象图可能很复杂,则将常规对象图转换成字节数组可能需要编写大量的代码。

那么,如何避免编写复杂的打包代码呢?以下提供了一种利用数据报包传输对象的方法,而且无需编写打包代码。

Java中通过数据报包输送对象的方法是什么

上图说明了使用数据报传输对象时的数据流。按以下给出的七个步骤,您就能实现这个数据流,它可传输任何类型的对象,myObject

  • 第一步。准备:通过实现 Serializable 接口使您的对象(比方说 myObject)可序列化。

  • 第二步。创建 ByteArrayOutputStream 对象,比方说,名为 baoStream

  • 第三步。用 baoStream 构造一个 ObjectOutputStream 对象,比方说 ooStream

  • 第四步。通过调用 ooStreamwriteObject() 方法将对象 myObject 写入 baoStream 中。

  • 第五步。使用 baoStreamtoByteArray() 方法从 baoStream 中检索字节数组缓冲区。

  • 第六步。使用由第五步检索到的数组缓冲区构造 DatagramPacket,比方说 dPacket

  • 第七步。通过调用 DatagramSocketsend() 方法发送 dPacket

要接收对象,以逆序完成以上所列各步,用 ObjectInputStream 代替 ObjectOutputStream,同时用 ByteArrayInputStream 代替 ByteArrayOutputStream

当用套接字编程时,sendTo 是无连接协议中使用的一个标准函数。为了能够传输对象,我重写了这个函数。以下代码示例展示了如何在 Sender 类中实现 send 方法:

import java.io.*;
import java.net.*;

public class Sender
{
 public void sendTo(Object o, String hostName, int desPort)
 {
 try
 {
 InetAddress address = .netAddress.getByName(hostName);
 ByteArrayOutputStream byteStream = new
 ByteArrayOutputStream(5000);
 ObjectOutputStream os = new ObjectOutputStream(new
 BufferedOutputStream(byteStream));
 os.flush();
 os.writeObject(o);
 os.flush();

 // 检索字节数组
 byte[] sendbuf = byteStream.toByteArray();
 DatagramPacket packet = new DatagramPacket(
 sendBuf, sendBuf.length, address, desPort);
 int byteCount = packet.getLength();
 dSock.send(packet);
 os.close();
 }
 catch (UnknownHostException e)
 {
 System.err.println("Exception: " + e);
 e.printStackTrace ();
 }
 catch (IOException e)
 { e.printStackTrace(); }
 }
}

以下代码清单说明了如何在 Receiver 类中实现 receive 方法。recvObjFrom 方法是供接收者接收对象的。您应在您的代码中包含此方法以接收运行时对象。

import java.io.*;
import java.net.*;

public class Receiver
{
 public Object recvObjFrom()
 {
 try
 {
 byte[] recvBuf = new byte[5000];
 DatagramPacket packet = new DatagramPacket(recvBuf,
 recvBuf.length);

 dSock.receive(packet);
 int byteCount = packet.getLength();

 ByteArrayInputStream byteStream = new
 ByteArrayInputStream(recvBuf);

 ObjectInputStream is = new
 ObjectInputStream(new BufferedInputStream(byteStream));
 Object o = is.readObject();
 is.close();
 return(o);
 }
 catch (IOException e)
 {
 System.err.println("Exception: " + e);
 e.printStackTrace ();
 }
 catch (ClassNotFoundException e)
 { e.printStackTrace(); }

 return(null);
 }
}

人们可能会担心字节数组的大小 -- 因为当您构造 ByteArrayOutputStreamByteArrayInputStream 时,您必须指定数组的大小。既然您不知道运行时对象的大小,您就很难指定其大小。运行时对象的大小通常是不可预知的。幸运的是,Java 的 ByteArrayInputStreamByteArrayOutputStream 类可根据需要自动扩展其大小。

到此,关于“Java中通过数据报包输送对象的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java中通过数据报包输送对象的方法是什么

本文链接: https://lsjlt.com/news/232405.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中通过数据报包输送对象的方法是什么
    这篇文章主要介绍“Java中通过数据报包输送对象的方法是什么”,在日常操作中,相信很多人在Java中通过数据报包输送对象的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中通过数据报包输送对象...
    99+
    2023-06-03
  • java输出document对象的方法是什么
    在Java中,输出一个Document对象,可以使用以下方法:1. 使用DOM方式输出:可以使用Transformer类将Docum...
    99+
    2023-10-11
    java
  • Java中对象打包的正确方式是什么?
    Java是一门面向对象的编程语言,在Java中,对象是非常重要的概念。对象的创建和管理对于Java程序的运行效率和稳定性有着至关重要的影响。在Java中,对象的打包也是非常重要的一部分,本篇文章将会介绍Java中对象打包的正确方式。 什么是...
    99+
    2023-07-23
    打包 接口 对象
  • java中的方法是对象么
    对象,类,属性,方法的解析:以人为例。类:人可以看作一个类。对象:具体到什么人(黄种人,白种人,黑种人,中国人等等)这就可以看作是对象,可以根据需求继续往下区分,比如 男人 女人。属性:比如说黄种人的特点:黄皮肤,黑头发,黑眼睛等等,这些就...
    99+
    2016-01-18
    java入门 java 方法 对象
  • java中什么是静态的对象和方法
    什么是静态变量Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。使用 static 可以修饰变量、方法和代码块...
    99+
    2016-04-17
    java入门 java 静态 对象 方法
  • Java中方法和对象的关系是什么
    在Java中,方法和对象是密切相关的。对象是类的实例,它可以拥有属性和行为。方法是对象的行为,它定义了对象可以执行的操作。 在Jav...
    99+
    2023-10-26
    Java
  • java发送tcp报文的方法是什么
    Java发送TCP报文的方法有多种,可以使用原生的Java Socket类、Java NIO(New I/O)包中的Channel类...
    99+
    2023-09-12
    java
  • Java中通过Class类获取Class对象的方法详解
    前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 J...
    99+
    2023-05-31
    java class类 class对象
  • Java中常用数据类型的输入输出方法是什么
    这篇文章主要介绍Java中常用数据类型的输入输出方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、Char型这里说的char型指的是只输入一个字符的情况。1.1  输入格式:import ...
    99+
    2023-06-22
  • java对象数组初始化的方法是什么
    Java对象数组可以使用以下两种方法进行初始化:1. 使用new关键字初始化数组并逐个赋值:首先使用new关键字创建数组对象,然后使...
    99+
    2023-08-15
    java
  • Java类对象封装的方法是什么
    Java类对象封装的方法是通过定义类、属性和方法来封装数据和行为。类是一种模板或蓝图,用于创建具有相似属性和行为的对象。属性是类的成...
    99+
    2023-10-23
    Java
  • java map转list对象的方法是什么
    Rate limit reached for gpt-3.5-turbo in organization org-68Lqb4iD2...
    99+
    2023-10-18
    java
  • java对象实例化的方法是什么
    Java对象实例化的方法有两种:使用new关键字和使用反射机制。1. 使用new关键字:最常用的实例化方法是使用new关键字,通过调...
    99+
    2023-08-15
    java
  • redis推送数据的方法是什么
    Redis推送数据的方法是使用PUBLISH命令。PUBLISH命令用于向指定的频道发布一条消息,订阅该频道的所有客户端都会收到这条...
    99+
    2023-08-23
    redis
  • java中的session对象及其常用方法是什么
    本篇内容主要讲解“java中的session对象及其常用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中的session对象及其常用方法是什么”吧!session对象用于在会话...
    99+
    2023-06-20
  • JAVA中对象复制与引用的方法是什么
    在Java中,对象的复制可以使用两种方法:浅复制和深复制。1. 浅复制(Shallow Copy):通过复制对象的引用,创建一个新的...
    99+
    2023-08-18
    JAVA
  • java实体对象转map的方法是什么
    Java实体对象转Map的方法有以下几种:1. 使用Java反射机制:通过使用Java的反射机制,可以获取实体对象的所有字段和对应的...
    99+
    2023-09-16
    java
  • java给list添加对象的方法是什么
    Java给List添加对象的方法是使用List的add()方法。该方法用于将指定的元素添加到列表的末尾。下面是使用add()方法添加...
    99+
    2023-09-25
    java
  • Java反序列化对象的方法是什么
    Java中反序列化对象的方法是使用ObjectInputStream类的readObject()方法。可以使用以下步骤来反序列化一个...
    99+
    2023-09-14
    Java
  • java创建多个对象的方法是什么
    在Java中,可以通过以下方法创建多个对象: 使用构造函数:可以通过调用类的构造函数来创建对象。构造函数是一个特殊的方法,用于初...
    99+
    2023-10-24
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作