1. 程式人生 > >Android 客戶端使用udp傳送請求並解析xml

Android 客戶端使用udp傳送請求並解析xml

1,UDP請求客戶端

package udp;

/**
 * <author> cwj
 * <time>  2018/8/27 15:29
 * <version>
 * <desc>UDP客戶端
 **/
public class UdpClient {

    public static void main(String[] args) {
    //請求時把實體類轉成xml資料
        UserBean userBean=new UserBean();
        userBean.setName("小明");
        userBean.setAge(15
); userBean.setSex("男"); String xml= XMLUtils.convertToXml(userBean); System.out.println(xml); SendThred send_receive=new SendThred("192.168.0.107",9090,xml); send_receive.start();//請求執行緒 ReceiveThred receiveThred=new ReceiveThred(9090, new IReceiveData() { @Override
public String receiveXML(String xml) { xml.trim();//接收 服務端返回的資料 User u2= (User) XMLUtils.convertXmlStrToObject(User.class,xml.trim()); return null; } }); receiveThred.start(); } }

2,傳送

package udp;




import
java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import static jdk.nashorn.internal.runtime.regexp.joni.Config.log; /** * <author> cwj * <time> 2018/8/27 15:43 * <version> * <desc>傳送接收執行緒類 **/ public class SendThred extends Thread { public String data; public String ip; private int port; private int Timeout=5000;//設定超時時間,5秒 public SendThred(String ip, int port, String data) { this.data = data; this.ip = ip; this.port = port; } @Override public void run() { //傳送 DatagramSocket socket = null; try { socket = new DatagramSocket(); socket.setSoTimeout(Timeout);//設定超時時間 byte[] buf = data.getBytes(); InetAddress address = InetAddress.getByName(ip); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet); log.print("傳送--"+new String(packet.getData(), "utf-8")); } catch (Exception e) { e.printStackTrace(); } } }

3,接收

package udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * <author> cwj
 * <time>  2018/8/27 16:48
 * <version>
 * <desc>接收
 **/
public class ReceiveThred extends Thread  {
    public int port;
    private IReceiveData iReceiveData;
    private int Timeout=5000;//設定超時時間,5秒
    public ReceiveThred(  int port, IReceiveData iReceiveData) {
        this.port = port;
        this.iReceiveData = iReceiveData;
    }

    @Override
    public void run() {
        DatagramSocket socket=null;
        try {
            socket = new DatagramSocket(port);
            socket.setSoTimeout(Timeout);//設定超時時間
            //準備空的資料包用於存放資料。
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); // 1024
            //呼叫udp的服務接收資料
            socket.receive(datagramPacket); //receive是一個阻塞型的方法,沒有接收到資料包之前會一直等待。 資料實際上就是儲存到了byte的自己陣列中了。
            String backMes = new String(datagramPacket.getData(), "gbk");
            System.out.print("接收端接收到服務端的資料"+backMes);
//            User u2= (User) XMLUtils.convertXmlStrToObject(User.class,backMes.trim());
            iReceiveData.receiveXML(backMes);
            //關閉資源
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }


}
package udp;

public interface IReceiveData {
    //獲取XML
    String receiveXML(String xml);
}

4,解析XML 用jdk自帶原生解析

      User u2= (User) XMLUtils.convertXmlStrToObject(User.class,xml.trim());

5,工具類

package udp;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;

/**
 * <author> cwj
 * <time>  2018/8/27 18:07
 * <version>
 * <desc>XML
 **/
public class XMLUtils {

    /**
     * 將物件直接轉換成String型別的 XML輸出
     *
     * @param obj
     * @return
     */
    public static String convertToXml(Object obj) {
        // 建立輸出流
        StringWriter sw = new StringWriter();
        try {
            // 利用jdk中自帶的轉換類實現
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml輸出的格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            // 將物件轉換成輸出流形式的xml
            marshaller.marshal(obj, sw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return sw.toString();
    }

    /**
     * 將物件根據路徑轉換成xml檔案
     *
     * @param obj
     * @param path
     * @return
     */
    public static void convertToXml(Object obj, String path) {
        try {
            // 利用jdk中自帶的轉換類實現
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml輸出的格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            // 將物件轉換成輸出流形式的xml
            // 建立輸出流
            FileWriter fw = null;
            try {
                fw = new FileWriter(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            marshaller.marshal(obj, fw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    /**
     * 將String型別的xml轉換成物件
     */
    public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            // 進行將Xml轉成物件的核心介面
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sr = new StringReader(xmlStr);
            xmlObject = unmarshaller.unmarshal(sr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }

    @SuppressWarnings("unchecked")
    /**
     * 將file型別的xml轉換成物件
     */
    public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            FileReader fr = null;
            try {
                fr = new FileReader(xmlPath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            xmlObject = unmarshaller.unmarshal(fr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }


}

6,解析的時候注意實體類的註解:

package udp;

import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 * 
 * @author Steven
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
//根部
@XmlRootElement(name = "User")
// 
@XmlType(propOrder = { 
        "userId", 
        "userName", 
        "password", 
        "birthday", 
        "money", 
})
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    // �û�Id
    private int userId;
    // �û���
    private String userName;
    // �û�����
    private String password;
    // �û�����
    private Date birthday;
    // �û�Ǯ��
    private double money;

    public User() {
        super();
    }

    public User(int userId, String userName, String password, Date birthday,
            double money) {
        super();
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.birthday = birthday;
        this.money = money;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User [birthday=" + birthday + ", money=" + money
                + ", password=" + password + ", userId=" + userId
                + ", userName=" + userName + "]";
    }

}

7,至於服務端的寫法,和客戶端的寫法類似。
不完整的地方,還請前輩們指點