`
shihuan830619
  • 浏览: 582842 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Socket请求XML客户端程序

    博客分类:
  • J2SE
阅读更多
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;
	}
	
}
分享到:
评论

相关推荐

    socket服务和客户端测试XML文件接收和发送

    1. **Socket服务端**:服务端是等待连接并处理来自客户端请求的程序。在C#中,我们首先创建一个Socket实例,然后绑定到特定的IP地址和端口号。接下来,调用`Listen()`方法开始监听客户端的连接请求。当有客户端连接...

    socket客户端长连接实现以及xml文件解析

    本篇文章将深入探讨如何实现socket客户端的长连接,并解析XML文件。 首先,让我们了解一下Socket。Socket是计算机网络中进程间通信的一种端点,它提供了进程在网络中的双向通信接口。在客户端-服务器架构中,客户端...

    一个简单的Socket服务器客户端源程序

    - **接受(Accept)**:当有客户端连接请求时,使用`accept()`函数接收连接请求,返回一个新的Socket用于与客户端通信。 - **接收数据(Receive)**:使用`recv()`函数从客户端接收数据。 - **发送数据(Send)**...

    Socket (含有客户端和服务器端 QQ实例 )

    本案例"Socket (含有客户端和服务器端 QQ实例)"旨在帮助开发者深入理解如何利用Socket进行网络应用程序的开发,尤其是对于创建类似QQ这样的即时通讯应用。 首先,我们来了解一下Socket的基本概念。Socket是操作系统...

    C# 异步 SOCKET 服务和客户端

    本主题将深入探讨"C#异步SOCKET服务和客户端",这是一项用于实现实时信息传输的关键技术。 首先,理解SOCKET的基本概念至关重要。SOCKET是操作系统提供的一个接口,它允许应用程序通过网络进行通信。在C#中,System...

    基于Android的简单Socket服务端与客户端

    客户端程序(SocketClient)主要包括: 1. 创建Socket对象,指定服务器的IP地址和端口号。这里的IP地址应改为与服务端在同一局域网内的IP。 2. Socket的connect()方法用于发起连接请求。如果连接成功,也会得到输入...

    socket实现服务器和客户端数据的传输

    Socket编程的基本原理是,服务器创建一个监听Socket,等待客户端的连接请求,一旦有请求到来,服务器就与客户端建立连接,然后通过这个连接交换数据。 在C++中,我们可以使用标准库中的`&lt;sys/socket.h&gt;`和`...

    Socket服务端客户端以tcp/ip协议发送接收报文

    当有客户端连接时,会创建一个新的线程来处理这个连接,这样可以同时处理多个客户端请求。`ServerThread`类负责读取客户端发送的数据,打印出来,并将接收到的消息原样返回给客户端。 接着,我们看客户端的实现。...

    无阻塞Socket服务端、客户端示例

    在服务端,我们需要创建一个监听Socket,设置为非阻塞模式,然后通过accept()函数来接收客户端连接请求。由于无阻塞模式,accept()可能在没有新连接到来时立即返回,此时我们需要处理EWOULDBLOCK或EAGAIN这样的错误...

    【良心出品】Socket服务端和客户端XML生成与解析java代码.doc

    2. **并发与多线程**:为了提高程序的响应速度和处理能力,可以采用多线程的方式处理客户端请求。 3. **安全性和加密**:对于敏感数据的传输,应考虑使用SSL/TLS等加密协议确保数据的安全性。 4. **性能优化**:...

    socket服务端和客户端通讯

    Socket分为两大类:服务器端Socket(Server Socket)和客户端Socket(Client Socket),它们分别对应于网络通信中的服务提供者和服务请求者。 1. 服务器端Socket: - **监听(Listen)**:服务器启动后,需要创建...

    pb socket xml操作源码

    在描述中提到的“socket通信”,可能涉及到TCP或UDP协议,包括如何创建socket,绑定端口,监听连接,接受客户端请求,以及数据的发送和接收流程。 最后,`XML`(eXtensible Markup Language)是一种用于存储和传输...

    Linux下C语言编写服务端、客户端程序。(客户端程序上传其主机 CPU、内存、硬盘空 间开销)

    在Linux环境下,使用C语言开发服务端和客户端程序是一项常见的任务,特别是在网络编程中。这里的项目要求客户端程序能够收集并发送其主机的CPU使用率、内存占用情况以及硬盘空间使用情况,而服务端则需要接收这些...

    灵活方便的TCP/IP Socket服务端及客户端工具

    当收到客户端的连接请求时,accept()函数会被调用来接受连接,并为每个新连接创建一个新的Socket。 4. **客户端编程**:客户端首先需要创建Socket,然后调用connect()函数来尝试与服务器建立连接。连接成功后,就...

    Postman模拟请求

    - GET请求:用于获取资源,Postman可以方便地构造GET请求,获取服务器上的数据。 - POST请求:通常用于向服务器发送数据,创建新的资源。在Postman中,用户可以填写请求体,设置Content-Type,如application/json...

    用Socket实现的聊天程序

    在这个聊天程序中,服务器端通常会创建一个监听Socket,等待客户端的连接请求。当客户端发起连接时,服务器端接受连接并创建一个新的Socket与客户端进行通信。这个过程涉及到`ServerSocket`类的`accept()`方法。 ...

    Socket聊天程序示例

    在这个"Socket聊天程序示例"中,我们探讨的是如何构建一个简单的网络聊天环境,其中每个终端都可以同时作为服务器和客户端进行交互。 首先,我们要了解Socket的基本概念。在TCP/IP协议栈中,Socket是应用层与传输层...

    Socket Xml 测试

    在Socket编程中,我们通常会创建一个ServerSocket来监听特定端口的连接请求,然后通过accept()方法接收客户端的Socket连接。与此同时,客户端通过Socket类建立到服务器的连接,并通过输入/输出流发送和接收数据。 ...

    C# Socket 客户端服务端封装 支持多连接处理 Tasks多线程 队列处理 大数据拆分包处理

    在IT领域,网络通信是应用程序之间进行数据交换的关键技术,而C#中的Socket编程则提供了实现这一功能的基础。本文将详细解析标题和描述中提到的"C# Socket客户端服务端封装,支持多连接处理,Tasks多线程,队列处理...

    C#使用SuperSocket实现自定义协议实现CS架构服务器和客户端程序设计).zip

    在本项目中,"C#使用SuperSocket实现自定义协议实现CS架构服务器和客户端程序设计"),开发者利用C#编程语言以及SuperSocket开源库构建了一套C/S(客户端/服务器)架构的应用。SuperSocket是一个轻量级、高度可扩展的...

Global site tag (gtag.js) - Google Analytics