package org.infosec.ismp.eventd.sender;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.infosec.ismp.model.event.Event;
import org.infosec.ismp.model.event.EventReceipt;
import org.infosec.ismp.model.event.Events;
import org.infosec.ismp.model.event.Log;
import org.infosec.ismp.util.ThreadCategory;
public class UdpEventSocket {
private DatagramSocket m_dgSocket;
private DatagramPacket m_pkt;
public UdpEventSocket() {
init();
}
public void init() {
try {
m_dgSocket = new DatagramSocket();
} catch (SocketException e) {
log().error("创建DatagramoSocket 出错" + e);
}
}
/**
* 将事件发送到指定的目的地址
*
* @param e
* @param addr
* @param port
* @return
*/
public void sendEvent(Event e, InetAddress addr, int port)
throws Exception {
Events events = new Events();
events.addEvent(e);
Log log = new Log();
log.setEvents(events);
StringWriter writer = new StringWriter();
try {
Marshaller.marshal(log, writer);
} catch (MarshalException e1) {
log().warn("marshall log error : " + e1, e1);
} catch (ValidationException e1) {
log().warn("marshall log error : " + e1, e1);
}
String dataXml = writer.toString();
if (StringUtils.trimToNull(dataXml) == null) {
log().error("event cannot marshall " + e);
throw new Exception("event cannot marshall");
}
byte[] data = dataXml.getBytes();
m_pkt = new DatagramPacket(data, data.length);
// m_pkt.setAddress(InetAddress.getByName("127.0.0.1"));
// m_pkt.setPort(5817);
System.out.println("add is : "+addr);
System.out.println("port is : "+port);
System.out.println("m_dgSocket is : "+m_dgSocket.getLocalPort());
m_pkt.setAddress(addr);
m_pkt.setPort(port);
m_dgSocket.send(m_pkt);
}
public List<EventReply> receive()throws IOException{
byte[] buf = new byte[0xff];
DatagramPacket packet = new DatagramPacket(buf,0,0xff);
m_dgSocket.receive(packet);
byte[] data = packet.getData();
// System.out.println("receive data is : "+new String(data,"utf-8"));
StringReader reader = new StringReader(new String(data,0,packet.getLength(),"utf-8"));
EventReceipt receipt = null;
try {
receipt = (EventReceipt)Unmarshaller.unmarshal(EventReceipt.class, reader);
} catch (MarshalException e) {
e.printStackTrace();
} catch (ValidationException e) {
e.printStackTrace();
}
InetAddress remoteAddr = packet.getAddress();
int port = packet.getPort();
List<EventReply> replys = new ArrayList<EventReply>();
if(receipt!=null){
String[] uuids = receipt.getUuid();
for(String uuid:uuids){
EventReply reply = new EventReply(remoteAddr, port, uuid);
replys.add(reply);
}
}
return replys;
}
private ThreadCategory log() {
return ThreadCategory.getInstance(UdpEventSocket.class);
}
}