編輯:關於Android編程
什麼是Android UDP?
UDP是User Datagram Protocol的簡稱,中文名是用戶數據包協議,是OSI參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。它是IETF RFC 768是UDP的正式規范。在網絡中它與TCP協議一樣用於處理數據包。在OSI模型中,在第四層-傳輸層,處於IP協議的上一層。UDP有不提供數據報分組、組裝和不能對數據包的排序的缺點,也就是說,當報文發送之後,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天,UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。
與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。
UDP協議的主要作用是將網絡數據流量壓縮成數據報的形式。一個典型的數據報就是一個二進制數據的傳輸單位。每一個數據報的前8個字節用來包含報頭信息,剩余字節則用來包含具體的傳輸數據。
TCP和UDP在android中的使用和在Java裡是完全一樣的。
服務端:
復制代碼 代碼如下:
package com.cheerchip.core;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import android.util.Log;
public class UDPServer implements Runnable {
private static final int PORT = 6000;
private byte[] msg = new byte[1024];
private boolean life = true;
public UDPServer() {
}
/**
* @return the life
*/
public boolean isLife() {
return life;
}
/**
* @param life
* the life to set
*/
public void setLife(boolean life) {
this.life = life;
}
@Override
public void run() {
DatagramSocket dSocket = null;
DatagramPacket dPacket = new DatagramPacket(msg, msg.length);
try {
dSocket = new DatagramSocket(PORT);
while (life) {
try {
dSocket.receive(dPacket);
Log.i("msg sever received", new String(dPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
客戶端:
復制代碼 代碼如下:
package com.cheerchip.core;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPClient {
private static final int SERVER_PORT = 6000;
private DatagramSocket dSocket = null;
private String msg;
/**
* @param msg
*/
public UDPClient(String msg) {
super();
this.msg = msg;
}
/**
* 發送信息到服務器
*/
public String send() {
StringBuilder sb = new StringBuilder();
InetAddress local = null;
try {
local = InetAddress.getByName("localhost"); // 本機測試
sb.append("已找到服務器,連接中...").append("/n");
} catch (UnknownHostException e) {
sb.append("未找到服務器.").append("/n");
e.printStackTrace();
}
try {
dSocket = new DatagramSocket(); // 注意此處要先在配置文件裡設置權限,否則會拋權限不足的異常
sb.append("正在連接服務器...").append("/n");
} catch (SocketException e) {
e.printStackTrace();
sb.append("服務器連接失敗.").append("/n");
}
int msg_len = msg == null ? 0 : msg.length();
DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len,
local, SERVER_PORT);
try {
dSocket.send(dPacket);
sb.append("消息發送成功!").append("/n");
} catch (IOException e) {
e.printStackTrace();
sb.append("消息發送失敗.").append("/n");
}
dSocket.close();
return sb.toString();
}
}
主Activity:
復制代碼 代碼如下:
public class MainAct extends Activity {
EditText msg_et = null;
Button send_bt = null;
TextView info_tv = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
msg_et = (EditText) findViewById(R.id.msg_et);
send_bt = (Button) findViewById(R.id.send_bt);
info_tv = (TextView) findViewById(R.id.info_tv);
// 開啟服務器
ExecutorService exec = Executors.newCachedThreadPool();
UDPServer server = new UDPServer();
exec.execute(server);
// 發送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UDPClient client = new UDPClient(msg_et.getText().toString());
info_tv.setText(client.send());
}
});
}
}
注意在配置文件中要加上:
以獲取相應的權限。
效果圖:
LogCat打印出來的服務器端信息:
一、效果:我們看到很多軟件的通訊錄在右側都有一個字母索引功能,像微信,小米通訊錄,QQ,還有美團選擇地區等等。這裡我截了一張美團選擇城市的圖片來看看; 我們今天就來實現
Android L: Google已經確認Android L就是Android Lollipop(5
如果你的微信想讓陌生人看到你的照片卻不想給看到太多,我們可以通過設置,可以允許陌生人查看朋友圈十張照片,那麼微信怎麼設置陌生人可以查看朋友圈十張照片呢?就讓
Bluetooth Using the Bluetooth APIs, an Android application can perform the following: