`
ws00739818
  • 浏览: 2792 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Java网络编程基础 Datagram类使用方法 (1)

阅读更多
•Socket 是 TCP 客户端 API,通常用于连接远程主机。
•ServerSocket 是 TCP 服务器 API,通常接受源于客户端套接字的连接。
•DatagramSocket 是 UDP 端点 API,用于发送和接收数据包
•MulticastSocket 是 DatagramSocket 的子类,在处理多播组时使用。

应用程序的工作流程如下:

(1)首先要建立数据报通信的Socket,我们可以通过创建一个DatagramSocket对象实现它,在Java中DatagramSocket类有如下两种构造方法:

public DatagramSocket() 构造一个数据报socket,并使其与本地主机任一可用的端口连接。若打不开socket则抛出SocketException异常。

public DatagramSocket(int port) 构造一个数据报socket,并使其与本地主机指定的端口连接。若打不开socket或socket无法与指定的端口连接则抛出SocketException异常。

(2)创建一个数据报文包,用来实现无连接的包传送服务。每个数据报文包用DatagramPacket类创建,DatagramPacket对象封装了数据报包数据、包长度、目标地址和目标端口。客户端要发送数据报文包,要调用DatagramPacket类以如下形式的构造函数创建DatagramPacket对象,将要发送的数据和包文目的地址信息放入对象之中。DatagramPacket(byte bufferedarray[],int length,InetAddress address,int port)即构造一个包长度为length的包传送到指定主机指定端口号上的数据报文包,参数length必须小于等于bufferedarry.length。

DatagramPacket类提供了4个类获取信息:

public byte[] getData() 返回一个字节数组,包含收到或要发送的数据报中的数据。

public int getLength() 返回发送或接收到的数据的长度。

public InetAddress getAddress() 返回一个发送或接收此数据报包文的机器的IP地址。

public int getPort() 返回发送或接收数据报的远程主机的端口号。

(3)创建完DatagramSocket和DatagramPacket对象,就可以发送数据报文包了。发送是通过调用DatagramSocket对象的send方法实现,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。

(4)当然,我们也可以接收数据报文包。为了接收从服务器返回的结果数据报文包,我们需要创建一个新的DatagramPacket对象,这就需要用到DatagramPacket的另一种构造方式DatagramPacket(byte bufferedarray[],int length),即只需指明存放接收的数据报的缓冲区和长度。调用DatagramSocket对象的receive()方法完成接收数据报的工作,此时需要将上面创建的DatagramPacket对象作为参数,该方法会一直阻塞直到收到一个数据报文包,此时DatagramPacket的缓冲区中包含的就是接收到的数据,数据报文包中也包含发送者的IP地址,发送者机器上的端口号等信息。

(5)处理接收缓冲区内的数据,获取服务结果。

(6)当通信完成后,可以使用DatagramSocket对象的close()方法关闭数据报通信Socket。当然,Java会自动关闭Socket,释放DatagramSocket和DatagramPacket所占用的资源。但是作为一种良好的编程习惯,还是要显式地予以关闭。

package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;


/**
 * <li>Description:</li>
 * <li>$Author$</li>
 * <li>$Revision$</li>
 * <li>$Date$</li>
 * @version 1.0
 */
public class UDPServer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        byte[] buf= new byte[1000];
        DatagramPacket receivePacket=new DatagramPacket(buf,buf.length);
        DatagramSocket receiveSocket = null;
        try {
           receiveSocket = new DatagramSocket(10000) ;
           System.out.println("startinig to receive packet");
           while(true){
               receiveSocket.receive(receivePacket);
               String name=receivePacket.getAddress().toString();
               System.out.println("\n来自主机:"+name+"\n端口:"
               +receivePacket.getPort());
               String s=new
               String(receivePacket.getData(),0,receivePacket.getLength());
               System.out.println("the received data: "+s);
           }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * <li>Description:</li>
 * <li>$Author$</li>
 * <li>$Revision$</li>
 * <li>$Date$</li>
 * 
 * @version 1.0
 */
public class UDPClient {

    /**
     * @param args
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException {
        String str = new String("java networking");
        byte[] data = str.getBytes();
        InetAddress ineta = InetAddress.getByName("cdde-03");
        DatagramPacket p = new DatagramPacket(data, data.length, ineta, 10000);//指定服务器端口
        DatagramSocket sendSocket=null;
        try {
            sendSocket = new DatagramSocket(5000);//任意一个未占用端口(服务器端口已占用所以不可用)
            System.out.println("sending data...");
            sendSocket.send(p);

        } catch (SocketException e) {
            System.out.println("打不开socket或socket无法与指定的端口连接...");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("网络通信出现错误...");
            e.printStackTrace();
        }
    }
}
分享到:
评论

相关推荐

    JAVA网络编程

    Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 ...

    Java网络编程的研究

    针对不同层次的网络通信,Java提供的网络功能有4大类:URL、InetAddress、Socket、Datagram。以基于Socket的Java网络编程为例,来探讨Java网络编程,具有一定的参考价值。

    第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社.pptx

    JAVA 面向对象程序设计教程 第13章 Java网络编程 第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社全文共17页,当前为第1页。 第13章 Java网络编程 第13章-Java网络编程-Java面向对象...

    java网络编程技术课程设计.doc

    TCP网络通信程序设计与实现 摘要: 目前,基于TCP/IP... 2.2 java网络编程技术 Java语言是在网络环境下诞生的,所以Java语言虽然不能说是对于网络编程的支持最好 的语言,但是必须说是一种对于网络编程提供良好支持的

    Java之网络编程篇

    Java网络编程,涉及Socket,Datagram 等知识!

    java基础案例与开发详解案例源码全

    19.2 Java网络类和接口497 19.3 InetAddress类498 19.4 URL和URLConnection类499 19.5 Scoket套接字505 19.6 Datagram套接字509 19.7 综合示例512 19.8 本章习题520 第20章 20.1 网络版五子棋522 20.1.1 需求描述522...

    基于Java的视频会议系统(软件程序+WORD论文文档).zip

    网络视频会议首先是基于网络传输的,那么就必然要依托于JAVA网络编程的相关知识。在这基础上,由于相关音频、视频,所以还要涉及到JAVA的多媒体技术的相关知识,即JMF (Java Media Framework)。利用JAVA的这个组件,...

    NetFlow Export Datagram Format

    In Versions 1, 5, and 7, the datagram consists of a header and one or more flow records. The first field of the header contains the version number of the export datagram. Typically, a receiving ...

    Qt5网络编程之UDP协议---实例

    UDP(User Datagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。这里我们还要了解一个名词Socket,也就是...

    网络编程课件 Socket编程

    第六章 Socket编程 1、什么是套接字 套接字是一组用于编写网络程序的API 常见的套接字有: --Windows平台 WinSock --Unix/Linux socket 套接字类型: --stream socket 面向流的一种套接字。 --datagram socket...

    java经典面试2010集锦100题(不看你后悔)

    C) 抽象类与接口的用法几乎都相同,具体用哪一个方法,只是在于程序设计人员的编程习惯而已。 D) 在Java中,最多使用的是抽象类,因为应用抽象类也可以实现多继承。而接口已经被限制使用。 题目21:d 程序如下: ...

    Java教程补充材料

    1 Java Characteristics 2 Discussion on Operator and Operand Evaluations 3 The "&" and "|" Operators 4 Bit-wise Operations 5 Statement Labels with break and continue 6 Enumerated Types 7 ...

    Linux网络通信编程socket

    通过学习为后续Linux网络编程奠定基础。首先介绍网络编程的概念,即网络协议分层,旨在帮助读者对网络建立初步的、全面立体的认识,其次介绍包括协议、端口、地址等;最后介绍应用非常广泛的传输控制协议...

    Networking-Lab:网络实验室实验基础

    这包含了使用 JAVA 进行网络编程的新手所需的所有程序。 这对所有愿意在 JAVA 中学习网络编程的本科生都有用。 套接字通信。 客户端服务器回显 TCP 和 UDP。 客户端服务器聊天 TCP 和 UDP。 远程方法调用 (RMI)...

    linux网络编程学习笔记

    序使用 这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的. UDP(User Datagram Protocol)用户数据报协议是一种非面向连接的协议,这种协议并不能保证 我们的网络程序的连接是可靠的,所以我们...

    udp.docx UDP(User Datagram Protocol)是一种在计算机网络中常用的传输层协议,它提供了一种简单

    UDP(User Datagram Protocol)是一种在计算机网络中常用的传输层协议,它提供了一种简单的、无连接的数据传输服务。与TCP不同,UDP不提供可靠性、顺序传输和拥塞控制等功能,因此在某些情况下,UDP比TCP更适合。 ...

    Java使用Socket通信传输文件的方法示例

    主要介绍了Java使用Socket通信传输文件的方法,结合实例形式分析了java socket编程实现文件传输操作的相关技巧,需要的朋友可以参考下

    网络编程实验-ping实验报告.doc

    网络编程-PING程序设计实验指导书 一.实验目的 (1)熟悉原始套接字编程。 (2)了解网络的结构。 (3)了解网络传输底层协议。 二.实验要求 PING程序是用于测试网络连通性的程序。要求在WINDOWS环境下实现基本的...

    韩国DATAGRAM无线网卡驱动DUWR-5400BG.rar

    韩国DATAGRAM无线网卡驱动DUWR-5400BG

    linux网络编程用到的网络函数详解用和使用示例

    TCP:(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端之间的传输是可靠的。UDP:(User Datagram Protocol)用户数据报协议是一...

Global site tag (gtag.js) - Google Analytics