Android 客戶端使用udp傳送請求並解析xml
阿新 • • 發佈:2018-11-23
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,至於服務端的寫法,和客戶端的寫法類似。
不完整的地方,還請前輩們指點