Socket要求XMLクライアントプログラム


SocketClient.JAvaファイル:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;


/**
 *    XML:<?xml version="1.0" encoding="gb2312" ?>
 *		     <request type="add/delete/query">	
 *				<resource class="if" resid="172.19.128.12 FastEthernet3/7" ne="172.19.128.12"/>
 *		     </request>
 *    XML:<?xml version="1.0" encoding="gb2312" ?>
 *			<respond type ="add/delete/query">	
 *				<resource class="if" resid="172.19.128.12 FastEthernet3/7" ne="172.19.128.12"/>
 *				<result value="0/-1/-2/-21/-22/-23"/>
 *			</respond>
 * 
 * */
public class SocketClient extends Thread {

	private static final Logger logger = Logger.getLogger(SocketClient.class);
	
	/**
	 *     XML  
	 * */
	private Document createXML(){
		Document document = DocumentHelper.createDocument();
		Element requestElement = document.addElement("request");
		
		//     
//		requestElement.addComment("  xml     ");
		
		requestElement.addAttribute("type", "add");
		
		Element resourceElement = requestElement.addElement("resource");
		resourceElement.addAttribute("class", "if");
		resourceElement.addAttribute("resid", "'172.19.128.12 FastEthernet3/7");
		resourceElement.addAttribute("ne", "172.19.128.12");
		
		return document;
	}
	
	/**
	 *   XML  
	 * */
	private String updateXML(String xmlString){
		String xml = "";
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read( new StringReader(xmlString.trim()));
			List list = doc.selectNodes("/request");
			Iterator it = list.iterator();
			while(it.hasNext()){
				Element requestElement = (Element)it.next();
				requestElement.setName("respond");   //       
				Element resultElement = requestElement.addElement("result");   //       
				resultElement.addAttribute("value", "-22");
			}
			
			xml = doc.asXML();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return xml;
	}
	
	private List<ClientDto> parseXML(String xml){
		List<ClientDto> list = new ArrayList<ClientDto>();
		ClientDto cdDto = new ClientDto();
		SAXReader saxReader = new SAXReader();   
		Document document = null;   
        try {   
//        	document = DocumentHelper.parseText(xml);
            document = saxReader.read(new ByteArrayInputStream(xml.getBytes()));   
//            Element xmlInfo = document.getRootElement();   
//            String rootnode = xmlInfo.getName();
//            String roottype = xmlInfo.attributeValue("type");
            
            Iterator dociter = document.nodeIterator();
            for (Iterator iterator = dociter; iterator.hasNext();) {
            	Node node = (Node) iterator.next();
            	Element nodeInfo = node.getParent();
            	String nodeName = nodeInfo.getName();
            	if(nodeName.equals("request")){
            		cdDto.setRootType(nodeInfo.attributeValue("type"));
            	}
            	if(nodeName.equals("resource")){
            		cdDto.setClassType(nodeInfo.attributeValue("class"));
            		cdDto.setResid(nodeInfo.attributeValue("resid"));
            		cdDto.setNe(nodeInfo.attributeValue("ne"));
            	}
            	list.add(cdDto);
			}
        } catch (DocumentException e) {     
            e.printStackTrace();   
        }  
        
        return list;
	}
	
	/**
	 *     XML     
	 * */
	private void sendXML(Socket socket_client, Document document){
		OutputStream os = null;
		try {
			os = new BufferedOutputStream(socket_client.getOutputStream());
			String xmlStr = document.asXML().trim();
			byte[] information = getInformation(xmlStr);
			os.write(information);
			os.flush();
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 *   telnet         
	 * */
	private void connectedStr(Socket socket_client, String inStr){
		PrintWriter pw = null;
		try {
			pw = new PrintWriter(socket_client.getOutputStream());
//			pw.println(inStr);
			pw.write(inStr);
			pw.flush();
			pw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 *  int         byte[]  
	 * 
	 * @param n
	 * @return
	 */
	private static byte[] getIntToByte(int n) {
		byte[] V_byte = new byte[4];
		V_byte[0] = (byte) (n & 0xff);
		V_byte[1] = (byte) (n >> 8 & 0xff);
		V_byte[2] = (byte) (n >> 16 & 0xff);
		V_byte[3] = (byte) (n >> 24 & 0xff);
		return V_byte;
	}
	public static int getByteToInt(byte[] b){
       int result = b[3] & 0xff;
       result = (result << 8) + (b[2] & 0xff);
       result = (result << 8) + (b[1] & 0xff);
       result = (result << 8) + (b[0] & 0xff);
       return result;
	
	}
	
	/**
	 *  String   XML   byte  
	 * */
	private byte[] getInformation(String xml){
		byte[] alarm = xml.getBytes();
		byte[] length = getIntToByte(alarm.length);
		int infoLength = 4 + alarm.length;
		byte[] information = new byte[infoLength];
		for (int i = 0; i < information.length; i++) {
			if (i < 4) {
				information[i] = length[i];
			} else {
				information[i] = alarm[i - 4];
			}
		}
		return information;
	}
	
	/**
	 *    Server     XML  
	 * */
	private String receiveInfo(Socket socket_client){
		InputStream is = null;
		String xml = "";
		try {
			is = new BufferedInputStream(socket_client.getInputStream());
			byte [] head = new byte[4];
			is.read(head ,0,4);
			int bodyLength = getByteToInt(head);
			if(bodyLength == 0) return null;
			byte[] body = new byte[1024];
			is.read(body, 0, bodyLength);
			xml = new String(body, 0, bodyLength).trim();
			logger.info("####   XML = "+xml);
			if(xml.charAt( xml.length()-1)!='>'){
				logger.debug("####      xml  ");
				new IOException("xml           '>' ");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return xml;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SocketClient sc = new SocketClient();
		Socket socket = null;
		String inStr = "";   //         
		if(args.length >0){
			inStr = StringUtils.trim(args[0]);
		}else{
			inStr = "start";
		}
		try {
			socket = new Socket("221.3.44.133", 7780);   //Telnet        
			sc.connectedStr(socket, inStr);   //       
			Document document = sc.createXML();   //  XML  
			sc.sendXML(socket, document);  //  XML  
			Thread.sleep(30 * 60 * 1000);   //30  
			String resultXML = sc.receiveInfo(socket);  //  XML  
			String updatedXML = sc.updateXML(resultXML);
			
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}

}

ClientDto.JAvaファイル:
import java.io.Serializable;

public class ClientDto implements Serializable {

	private String rootType;
	private String classType;
	private String resid;
	private String ne;
	private String resultValue;
	
	public ClientDto() {
	}

	public String getRootType() {
		return rootType;
	}

	public void setRootType(String rootType) {
		this.rootType = rootType;
	}

	public String getClassType() {
		return classType;
	}

	public void setClassType(String classType) {
		this.classType = classType;
	}

	public String getResid() {
		return resid;
	}

	public void setResid(String resid) {
		this.resid = resid;
	}

	public String getNe() {
		return ne;
	}

	public void setNe(String ne) {
		this.ne = ne;
	}

	public String getResultValue() {
		return resultValue;
	}

	public void setResultValue(String resultValue) {
		this.resultValue = resultValue;
	}
	
}