Java数据报编程之测试程序

编程|程序|数据

 
这里写得是后面数据报编程用到的测试程序,这个程序包括一套自定义事件,一个能滚动的显示图象的Java bean组件。

在面向对象的程序设计中,事件消息(Event Message)是对象间通信的基本方式。在图形用户界面程序中,GUI组件对象根据用户的交互产生各种类型的事件消息,这些事件消息由应用程序的事件处理代码捕获,在进行相应的处理后驱动消息响应对象做出反应。

对于本程序,需求是这样的:数据接收器把数据接收完毕时,要产生事件,该事件将激活事件处理器.为此要自定义相关对象类,在java中定义用户事件对象包括定义事件监听器和定义事件类,使用上和标准事件方式是一样的.

要定义的类包括:DataSwapEvent,DataSwapListener,同时还实现了一个包装器类DataSwapListenerAdapter类.

DataSwapEvent是一个事件类,类清单:

package recmail.multiservice;

import java.awt.*;
import java.net.DatagramPacket;

public class DataSwapEvent
    extends java.util.EventObject {
  Object source;
  String id;
  java.awt.Image image;
  private DatagramPacket dp;

  public DataSwapEvent() {
    super(null);
  }

  public DataSwapEvent(Object ob) {
    super(ob);
    this.source = ob;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public void setImage(Image img) {
    this.image = img;
  }

  public Image getImage() {
    return image;
  }

  public DatagramPacket getDatagram() {
    return dp;
  }

  public void setDatagram(DatagramPacket dp1) {
    dp = dp1;
  }
}

DataSwapListener类,这是监听器接口类.

package recmail.multiservice;

public interface DataSwapListener extends java.util.EventListener{
  public void OnDataSendFinished(Object s,DataSwapEvent e);
  public void OnDataRecvFinished(Object s,DataSwapEvent e);
}

DataSwapListenerAdapter包装器类,这不是一个简单的包装类,把注册监听器的功能也放在这里了.

package recmail.multiservice;

import java.util.*;

public class DataSwapListenerAdapter implements DataSwapListener{
  protected ArrayList listener;
  public DataSwapListenerAdapter() {
    listener = new ArrayList();
  }

  protected void addDataSwapListener(DataSwapListener dsl) {
    listener.add(dsl);
  }

  protected void removeDataSwapListener(DataSwapListener dsl) {
    listener.remove(dsl);
  }

  protected void processRecvFinishedEvent(DataSwapEvent e) {
    for (int i = 0; i < this.listener.size(); i++) {
      ( (DataSwapListener)this.listener.get(i)).OnDataRecvFinished(this, e);
    }
  }

  protected void processSendFinished(DataSwapEvent e) {
    for (int i = 0; i < this.listener.size(); i++) {
      ( (DataSwapListener)this.listener.get(i)).OnDataSendFinished(this, e);
    }
  }

  public void OnDataSendFinished(Object s, DataSwapEvent e) {
    Iterator it = listener.iterator();
    while (it.hasNext())
      ( (DataSwapListener) it.next()).OnDataRecvFinished(s, e);
  }

  public void OnDataRecvFinished(Object s, DataSwapEvent e) {
    Iterator it = listener.iterator();
    while (it.hasNext())
      ( (DataSwapListener) it.next()).OnDataRecvFinished(s, e);
  }
}

用这个类连接事件源和事件处理器即可达到更新目的.

最后这个类JImagePanel,用于显示图象,清单为:

package recmail.multiservice;

import java.awt.*;
import javax.swing.*;

public class JImagePanel extends JScrollPane{

  JImagePane imagepane = null;

  public JImagePanel() {
    imagepane = new JImagePane();
    this.getViewport().add(imagepane);
  }

  public synchronized void setImage(Image image) {
    imagepane.setImage(image);
  }

  class JImagePane
      extends JPanel {
    Image img;
    Insets insets;
    Dimension d;

    public JImagePane() {
      insets = this.getInsets();
    }

    public synchronized void setImage(Image image) {
      if (img != null) {
        img.flush();
        img = null;
      }
      this.img = image;
      if (img != null)
        setSize(image.getWidth(this), image.getHeight(this));
      else
        setSize(0, 0);
      this.repaint();
    }

    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (img != null)
        g.drawImage(img, insets.left, insets.top, this);
    }

    public Dimension getPreferredSize() {
      if (img != null) {
        return new Dimension(img.getWidth(this), img.getHeight(this));
      }
      else {
        return new Dimension(320, 160);
      }
    }

    public Dimension getMinimumSize() {
      if (img != null) {
        return new Dimension(img.getWidth(this), img.getHeight(this));
      }
      else {
        return new Dimension(320, 160);
      }
    }

    public Dimension getMaximumSize() {
      if (img != null) {
        return new Dimension(img.getWidth(this), img.getHeight(this));
      }
      else {
        return new Dimension(320, 160);
      }
    }

    public Dimension getSize() {
      if (img != null) {
        return new Dimension(img.getWidth(this), img.getHeight(this));
      }
      else {
        return new Dimension(320, 160);
      }
    }

    private void setSiz() {
      this.setPreferredSize(d);
      this.setMinimumSize(d);
      this.setMaximumSize(d);
      this.setSize(d);
    }
  }
}

对于这些类使用接下来就将使用.

时间: 2024-12-29 18:55:26

Java数据报编程之测试程序的相关文章

Java数据报编程之概说

编程|数据   一般说明 在TCP/IP协议族中,UDP和TCP同样位于传输层,用户数据报是UDP协议中的概念. UDP协议提供面向事务的简单不可靠信息传送服务,它不提供对 IP 协议的可靠机制.流控制以及错误恢复功能. UDP 协议基本上是IP 协议与上层协议的接口,从整个用户数据在各层的包装看,UDP报文格式相当简单: 1632bitSource port源端口Destination port目标端口Length 报文长度(单位是字节,包括首部和用户数据区)Checksum(校验和)Data

Java数据报编程之组播

编程|数据   在信息时代,网络技术应用已经很普通.其中很多应用都依赖于从一个主机向多个主机或者从多个主机向多个主机发送同一信息的能力,在Internet上分发的数目可能达数十万台,这些都需要更高的带宽,并且大大超出了单播的能力.一种能最大限度地利用现有带宽的重要技术是IP组播. 1.IP组播技术的概念 IP组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术,是一点对多点的通信.在网络多媒体广播的应用中,当需要将一个节点的信号传送到多个节

java数据报编程

大家迄今看到的例子使用的都是"传输控制协议"(TCP),亦称作"基于数据流的套接字".根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利抵达目的地.换言之,它允许重传那些由于各种原因半路"走失"的数据.而且收到字节的顺序与它们发出来时是一样的.当然,这种控制与可靠性需要我们付出一些代价:TCP具有非常高的开销. 还有另一种协议,名为"用户数据报协议"(UDP),它并不刻意追求数据包会完全发送出去,也不能担保它们抵达的

Java数据报编程之广播

编程|数据   UDP广播,实际上是很简单的,理解IP编址方案,就理解什么是广播,很多文章称为多播,我认为称为广播比较好,因为多播是对广播和组播的泛指,在Java程序中处理自然是不同的了,本文和下一篇只为强调概念. 正如前面所说,广播地址包括定向广播地址和有限广播地址,TCP/IP协议规定,这两种地址只能在本地网络中出现,路由器执行了这个规定,不把目标地址为广播地址的报文转发到其它网络,而组播就不同,下一篇介绍组播编程. 这个广播的程序可以简单的通过修改单播程序中的报文的目标地址成广播地址即可成

Java数据报编程之单播

编程|数据   实际上,单播就是一个报文从源主机向另一个目标主机发送,接收目标只有一个. 首先,写收发器类DatagramRecvSender_s,这个类既要发送数据报又要接收数据报,发送一个文件夹中的所有图片,一张一张的进行,接收是在一个线程中进行,每收完一个文件,就激活一个事件,事件处理器处理这个事件. 类清单为: package recmail.multiservice; import java.net.DatagramPacket;import java.net.DatagramSock

【网络编程2】Java数据报套接字

这篇博文是本文学习<Java网络程序设计>书中第5章数据报套接字的学习总结.初学者网友学习这篇Java数据报套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院13网络工程 吴成兵 20160609 目录 1 目录 1 一 数据报套接字概述 二 DatagramPacket 21 创建DatagramPacket对象 211 创建的DatagramPacket

Java socket编程入门

编程 第一章:学习提示 我适合学习这份教程吗 Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了.Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制.大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是"点到为止",留给读者大量的想象空间.这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识.包含以下内容: •什么是Socket •它位于你的应用程序的哪些地方 •能正常

Java socket编程入门[1]

编程 第一章:学习提示 我适合学习这份教程吗 Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了.Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制.大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是"点到为止",留给读者大量的想象空间.这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识.包含以下内容:•什么是Socket•它位于你的应用程序的哪些地方•能正常运行的

Java Socket编程(四)

编程 重复和并发服务器 所有的这些调用都可以掷出一个UnknownHostException违例.如果一台计算机没有连接上DNS服务器,或者主机的确没有找到,这个违例就会被掷出.如果一台计算机没有一个激活的TCP/IP配置,getLocalHost()也为失败并掷出一个违例. 一旦一个地址被确定了,数据报就可以被送出了.下面的程序传输了一个字符串给目的socket: String toSend = "This is the data to send!"); byte[] sendbuf