Socket要求XMLクライアントプログラム
SocketClient.JAvaファイル:
ClientDto.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;
}
}