📄 actualudpmessenger.java
字号:
/* * @(#)$Id: ActualUDPMessenger.java,v 1.3 2004/07/02 23:59:22 huebsch Exp $ * * Copyright (c) 2001-2004 Regents of the University of California. * All rights reserved. * * This file is distributed under the terms in the attached BERKELEY-LICENSE * file. If you do not find these files, copies can be found by writing to: * Computer Science Division, Database Group, Universite of California, * 617 Soda Hall #1776, Berkeley, CA 94720-1776. Attention: Berkeley License * * Copyright (c) 2003-2004 Intel Corporation. All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE file. * If you do not find these files, copies can be found by writing to: * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, * Berkeley, CA, 94704. Attention: Intel License Inquiry. */package runtime.services.network.udp;import execution.EndExecution;import java.net.InetSocketAddress;import java.nio.channels.DatagramChannel;import java.util.HashMap;import java.util.LinkedList;import java.util.Vector;import services.LocalNode;import services.network.Payload;import services.network.udp.UDPClient;import services.network.udp.UDPMessenger;/** * Class ActualUDPMessenger * */public class ActualUDPMessenger implements UDPMessenger { private Object syncObject; private Vector listeners; private HashMap listenersClients, listenersTable, sendChannels; private LinkedList queuedData; private int objectInputBufferSize; protected Object udpSync; private ActualUDPThread runner; /** * Constructor ActualUDPMessenger * * @param syncObject * @param sleepTime * @param objectInputBufferSize */ public ActualUDPMessenger(Object syncObject, long sleepTime, int objectInputBufferSize) { this.syncObject = syncObject; this.objectInputBufferSize = objectInputBufferSize; this.listeners = new Vector(); this.listenersClients = new HashMap(); this.listenersTable = new HashMap(); this.sendChannels = new HashMap(); this.queuedData = new LinkedList(); // Setup thread to listen for new incoming data runner = new ActualUDPThread(this, listeners, sendChannels, queuedData, sleepTime, objectInputBufferSize); runner.start(); } /** * Method send * * @param destination * @param payload */ public void send(InetSocketAddress destination, Payload payload) { send(null, destination, payload); } /** * Method send * * @param source * @param destination * @param payload */ public void send(InetSocketAddress source, InetSocketAddress destination, Payload payload) { QueuedData data = QueuedData.allocate(payload, source, destination); queuedData.add(data); } /** * Method listen * * @param portNumber * @param client * @return */ public boolean listen(Integer portNumber, UDPClient client) { // Retrieve existing listener if it exists DatagramChannel theListener = (DatagramChannel) listenersTable.get(portNumber); if (theListener == null) { try { theListener = DatagramChannel.open(); InetSocketAddress listenSocket = new InetSocketAddress(LocalNode.myIPAddress, portNumber.intValue()); theListener.socket().bind(listenSocket); theListener.configureBlocking(false); listeners.add(theListener); listenersTable.put(portNumber, theListener); listenersClients.put(portNumber, client); sendChannels.put(listenSocket, theListener); return true; } catch (Exception exception) { throw new RuntimeException( "UDPMESSENGER: Unable to listen on UDP port: " + portNumber + "(" + exception.getMessage() + ")"); } } else { return false; } } /** * Method release * * @param portNumber */ public void release(Integer portNumber) { DatagramChannel theListener = (DatagramChannel) listenersTable.remove(portNumber); if (theListener != null) { listeners.remove(theListener); listenersClients.remove(portNumber); try { theListener.close(); } catch (Exception e) {} } } /** * Method runEvent * * @param localPort * @param remoteIPAddress * @param data */ protected void runEvent(int localPort, InetSocketAddress remoteIPAddress, Payload data) { // run the event synchronized (syncObject) { try { UDPClient client = (UDPClient) listenersClients.get(new Integer(localPort)); client.handleUDPNetwork(remoteIPAddress, data); } catch (Exception exception) { EndExecution.masterSync = exception; runner.end(); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -