multicastsocket.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 676 行 · 第 1/2 页

JAVA
676
字号
/* * @(#)MulticastSocket.java	1.47 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved.   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER   *    * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License version   * 2 only, as published by the Free Software Foundation.    *    * This program is distributed in the hope that it will be useful, but   * WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * General Public License version 2 for more details (a copy is   * included at /legal/license.txt).    *    * You should have received a copy of the GNU General Public License   * version 2 along with this work; if not, write to the Free Software   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA   * 02110-1301 USA    *    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa   * Clara, CA 95054 or visit www.sun.com if you need additional   * information or have any questions.  * */package java.net;import java.io.IOException;import java.io.InterruptedIOException;import java.util.Enumeration;/** * The multicast datagram socket class is useful for sending * and receiving IP multicast packets.  A MulticastSocket is * a (UDP) DatagramSocket, with additional capabilities for * joining "groups" of other multicast hosts on the internet. * <P> * A multicast group is specified by a class D IP address * and by a standard UDP port number. Class D IP addresses * are in the range <CODE>224.0.0.0</CODE> to <CODE>239.255.255.255</CODE>, * inclusive. The address 224.0.0.0 is reserved and should not be used. * <P> * One would join a multicast group by first creating a MulticastSocket * with the desired port, then invoking the * <CODE>joinGroup(InetAddress groupAddr)</CODE> * method: * <PRE> * // join a Multicast group and send the group salutations * ... * String msg = "Hello"; * InetAddress group = InetAddress.getByName("228.5.6.7"); * MulticastSocket s = new MulticastSocket(6789); * s.joinGroup(group); * DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), *                             group, 6789); * s.send(hi); * // get their responses! * byte[] buf = new byte[1000]; * DatagramPacket recv = new DatagramPacket(buf, buf.length); * s.receive(recv); * ... * // OK, I'm done talking - leave the group... * s.leaveGroup(group); * </PRE> * * When one sends a message to a multicast group, <B>all</B> subscribing * recipients to that host and port receive the message (within the * time-to-live range of the packet, see below).  The socket needn't * be a member of the multicast group to send messages to it. * <P> * When a socket subscribes to a multicast group/port, it receives * datagrams sent by other hosts to the group/port, as do all other * members of the group and port.  A socket relinquishes membership * in a group by the leaveGroup(InetAddress addr) method.  <B> * Multiple MulticastSocket's</B> may subscribe to a multicast group * and port concurrently, and they will all receive group datagrams. * <P> * Currently applets are not allowed to use multicast sockets. * * @author Pavani Diwanji * @since  JDK1.1 */publicclass MulticastSocket extends DatagramSocket {    /**     * Create a multicast socket.     *      * <p>If there is a security manager,      * its <code>checkListen</code> method is first called     * with 0 as its argument to ensure the operation is allowed.      * This could result in a SecurityException.     * <p>     * When the socket is created the      * {@link DatagramSocket#setReuseAddress(true)} method is      * called to enable the SO_REUSEADDR socket option.      *     * @exception IOException if an I/O exception occurs     * while creating the MulticastSocket     * @exception  SecurityException  if a security manager exists and its       *             <code>checkListen</code> method doesn't allow the operation.     * @see SecurityManager#checkListen     * @see java.net.DatagramSocket#setReuseAddress(boolean)      */    public MulticastSocket() throws IOException {	this(new InetSocketAddress(0));    }    /**     * Create a multicast socket and bind it to a specific port.     *      * <p>If there is a security manager,      * its <code>checkListen</code> method is first called     * with the <code>port</code> argument     * as its argument to ensure the operation is allowed.      * This could result in a SecurityException.     * <p>     * When the socket is created the     * {@link DatagramSocket#setReuseAddress(true)} method is     * called to enable the SO_REUSEADDR socket option.      *      * @param port port to use     * @exception IOException if an I/O exception occurs     * while creating the MulticastSocket     * @exception  SecurityException  if a security manager exists and its       *             <code>checkListen</code> method doesn't allow the operation.     * @see SecurityManager#checkListen     * @see java.net.DatagramSocket#setReuseAddress(boolean)      */    public MulticastSocket(int port) throws IOException {	this(new InetSocketAddress(port));    }    /**     * Create a MulticastSocket bound to the specified socket address.     * <p>     * Or, if the address is <code>null</code>, create an unbound socket.     * <p>     * <p>If there is a security manager,      * its <code>checkListen</code> method is first called     * with the SocketAddress port as its argument to ensure the operation is allowed.      * This could result in a SecurityException.     * <p>     * When the socket is created the     * {@link DatagramSocket#setReuseAddress(true)} method is     * called to enable the SO_REUSEADDR socket option.      *     * @param bindaddr Socket address to bind to, or <code>null</code> for     *                 an unbound socket.     * @exception IOException if an I/O exception occurs     * while creating the MulticastSocket     * @exception  SecurityException  if a security manager exists and its       *             <code>checkListen</code> method doesn't allow the operation.     * @see SecurityManager#checkListen     * @see java.net.DatagramSocket#setReuseAddress(boolean)      *     * @since 1.4     */    public MulticastSocket(SocketAddress bindaddr) throws IOException {	super((SocketAddress) null);	// Enable SO_REUSEADDR before binding	setReuseAddress(true);        getImpl().setIsMulticastSocket();	if (bindaddr != null) {	    bind(bindaddr);	}    }    /**     * The lock on the socket's TTL. This is for set/getTTL and     * send(packet,ttl).     */    private Object ttlLock = new Object();    /**     * The lock on the socket's interface - used by setInterface     * and getInterface     */    private Object infLock = new Object();    /**     * The "last" interface set by setInterface on this MulticastSocket     */    private InetAddress infAddress = null;    /**     * Set the default time-to-live for multicast packets sent out     * on this <code>MulticastSocket</code> in order to control the      * scope of the multicasts.     *     * <p>The ttl is an <b>unsigned</b> 8-bit quantity, and so <B>must</B> be     * in the range <code> 0 <= ttl <= 0xFF </code>.     *     * param ttl the time-to-live     * exception IOException if an I/O exception occurs     * while setting the default time-to-live value     * deprecated use the setTimeToLive method instead, which uses     * <b>int</b> instead of <b>byte</b> as the type for ttl.     * see #getTTL()     *    public void setTTL(byte ttl) throws IOException {	if (isClosed())	    throw new SocketException("Socket is closed");	getImpl().setTTL(ttl);    }     */    /**     * Set the default time-to-live for multicast packets sent out     * on this <code>MulticastSocket</code> in order to control the      * scope of the multicasts.     *     * <P> The ttl <B>must</B> be in the range <code> 0 <= ttl <=     * 255</code> or an IllegalArgumentException will be thrown.     * @exception IOException if an I/O exception occurs     * while setting the default time-to-live value     * @param ttl the time-to-live     * @see #getTimeToLive()     */    public void setTimeToLive(int ttl) throws IOException {	if (ttl < 0 || ttl > 255) {	    throw new IllegalArgumentException("ttl out of range");	}	if (isClosed())	    throw new SocketException("Socket is closed");	getImpl().setTimeToLive(ttl);    }    /**     * Get the default time-to-live for multicast packets sent out on     * the socket.     *     * exception IOException if an I/O exception occurs     * while getting the default time-to-live value     * return the default time-to-live value     * deprecated use the getTimeToLive method instead, which returns     * an <b>int</b> instead of a <b>byte</b>.     * see #setTTL(byte)     *    public byte getTTL() throws IOException {	if (isClosed())	    throw new SocketException("Socket is closed");	return getImpl().getTTL();    }     */    /**     * Get the default time-to-live for multicast packets sent out on     * the socket.     * @exception IOException if an I/O exception occurs while     * getting the default time-to-live value     * @return the default time-to-live value     * @see #setTimeToLive(int)     */    public int getTimeToLive() throws IOException {	if (isClosed())	    throw new SocketException("Socket is closed");	return getImpl().getTimeToLive();    }    /**     * Joins a multicast group. Its behavior may be affected by     * <code>setInterface</code> or <code>setNetworkInterface</code>.     *      * <p>If there is a security manager, this method first     * calls its <code>checkMulticast</code> method     * with the <code>mcastaddr</code> argument     * as its argument.     *      * @param mcastaddr is the multicast address to join     *      * @exception IOException if there is an error joining     * or when the address is not a multicast address.     * @exception  SecurityException  if a security manager exists and its       * <code>checkMulticast</code> method doesn't allow the join.     *      * @see SecurityManager#checkMulticast(InetAddress)     */    public void joinGroup(InetAddress mcastaddr) throws IOException {        if (isClosed()) {            throw new SocketException("Socket is closed");        }        SecurityManager security = System.getSecurityManager();        if (security != null) {            security.checkMulticast(mcastaddr);        }	if (!mcastaddr.isMulticastAddress()) {	    throw new SocketException("Not a multicast address");	}	getImpl().join(mcastaddr);    }    /**     * Leave a multicast group. Its behavior may be affected by     * <code>setInterface</code> or <code>setNetworkInterface</code>.     *      * <p>If there is a security manager, this method first     * calls its <code>checkMulticast</code> method     * with the <code>mcastaddr</code> argument     * as its argument.     *      * @param mcastaddr is the multicast address to leave     * @exception IOException if there is an error leaving     * or when the address is not a multicast address.     * @exception  SecurityException  if a security manager exists and its       * <code>checkMulticast</code> method doesn't allow the operation.     *      * @see SecurityManager#checkMulticast(InetAddress)     */    public void leaveGroup(InetAddress mcastaddr) throws IOException {        if (isClosed()) {            throw new SocketException("Socket is closed");        }        SecurityManager security = System.getSecurityManager();        if (security != null) {            security.checkMulticast(mcastaddr);        }	if (!mcastaddr.isMulticastAddress()) {            throw new SocketException("Not a multicast address");        }	getImpl().leave(mcastaddr);    }    /**     * Joins the specified multicast group at the specified interface.     *     * <p>If there is a security manager, this method first     * calls its <code>checkMulticast</code> method

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?