/*
* 作成日: 2009/03/19
*/
package jp.ac.fit.asura.nao.naoji;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import jp.ac.fit.asura.nao.DatagramService;
import org.apache.log4j.Logger;
/**
*
* TODO sinに託す.
*
* 連続して呼び出したときのふるまい考慮せろ バッファは使いまわしで。 バッファにqueueの利用?
*
*gameControler関連も単体テスト
*
* @author $Author: sey $
*
* @version $Id: $
*
*/
public class DatagramSocketService implements DatagramService {
private static final Logger log = Logger
.getLogger(DatagramSocketService.class);
// Channels
private DatagramChannel chan;
// ソケット
public DatagramSocket soc;
public DatagramPacket snd;
// private Queue queue;
// GameController uses 3838 port.
public final static int port = 3838;
public final static int size = 1024;
// final static int sndPort = 2001;
// バッファ
private ByteBuffer rcvbuf = ByteBuffer.wrap(new byte[size]);
public DatagramSocketService() {
log.debug("init datagramService");
try {
chan = DatagramChannel.open();
chan.configureBlocking(false);
soc = chan.socket();
soc.bind(new InetSocketAddress(port));
soc.setBroadcast(true);
} catch (Exception e) {
log.error("DatagramSocService: ", e);
return;
}
snd = null;
log.debug("initialing finished");
}
public void receive(ByteBuffer buf) {
log.debug("DatagramSocService: receive()");
try {
log.trace("DatagramSocService: waiting data...");
rcvbuf.clear();
SocketAddress from = chan.receive(buf);
if (from == null)
return;
log.trace("DatagramSocService: receive a packet");
return;
} catch (Exception e) {
// Loggerでlog吐く
log.error("DatagramSocService: ", e);
}
return;
}
public byte[] receive() {
log.debug("DatagramSocService: receive()");
try {
log.trace("DatagramSocService: waiting data...");
rcvbuf.clear();
SocketAddress from = chan.receive(rcvbuf);
if (from == null)
return null;
rcvbuf.flip();
log.trace("DatagramSocService: receive a packet");
byte[] b = new byte[rcvbuf.remaining()];
rcvbuf.get(b);
return b;
} catch (Exception e) {
// Loggerでlog吐く
log.error("DatagramSocService: ", e);
}
return null;
}
public int send(ByteBuffer buf) {
int rslt;
log.debug("DatagramSocService: send()");
try {
if (soc.getBroadcast() != true)
soc.setBroadcast(true);
rslt = chan.send(buf, new InetSocketAddress(InetAddress
.getByName("255.255.255.255"), port));
} catch (Exception e) {
log.error("DatagramSocService: ", e);
return 0;
}
log.debug("DatagramSocService: send a packet");
return rslt;
}
public void destroy() {
soc = null;
snd = null;
}
}