上一篇的兄弟篇
上一篇地址:http://www.itdecent.cn/p/457b24e5e0a5
基于UDP
UDP協(xié)議以數(shù)據(jù)包作為數(shù)據(jù)傳輸?shù)妮d體,也就是在數(shù)據(jù)傳輸時,我們需要將數(shù)據(jù)包裝成數(shù)據(jù)報,在數(shù)據(jù)報中指明目的主機(jī)地址和端口號,然后將數(shù)據(jù)報發(fā)出去,用到了兩個關(guān)鍵類:
- DatagramPacket 數(shù)據(jù)報包
- DatagramSocket 進(jìn)行端到端通信的類
服務(wù)器
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
@Override
public void run() {
try {
//步驟①創(chuàng)建服務(wù)器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8899);
//步驟②創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)
byte[] data =new byte[1024];//創(chuàng)建字節(jié)數(shù)組,指定接收的數(shù)據(jù)包的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//步驟③接收客戶端發(fā)送的數(shù)據(jù)
System.out.println("server loaded success,waiting...");
socket.receive(packet);//此方法在接收到數(shù)據(jù)報之前會一直阻塞
//步驟④讀取數(shù)據(jù)
String info=new String(data, 0, packet.getLength());
//為了簡單起見,這里就不再寫驗證的邏輯了
//步驟⑤定義客戶端的地址、端口號、數(shù)據(jù)
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="Welcome!!!".getBytes();
//步驟⑥創(chuàng)建數(shù)據(jù)報,包含響應(yīng)的數(shù)據(jù)信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//步驟⑦響應(yīng)客戶端
socket.send(packet2);
//步驟⑧關(guān)閉資源
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
客戶端
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(){
@Override
public void run() {
//步驟①定義服務(wù)器的地址、端口號、數(shù)據(jù)
InetAddress address= null;
try {
address = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int port=8899;
byte[] data="admin:123".getBytes();
//步驟②創(chuàng)建數(shù)據(jù)報,包含發(fā)送的數(shù)據(jù)信息
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
try {
//步驟③創(chuàng)建DatagramSocket對象
DatagramSocket socket = new DatagramSocket();
//步驟④向服務(wù)器端發(fā)送數(shù)據(jù)報
socket.send(packet);
//步驟⑤創(chuàng)建數(shù)據(jù)報,用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
byte[] data2=new byte[1024];
DatagramPacket packet2=new DatagramPacket(data2, data2.length);
//步驟⑥接收服務(wù)器響應(yīng)的數(shù)據(jù)
socket.receive(packet2);
//步驟⑦讀取數(shù)據(jù)
String reply=new String(data2, 0, packet2.getLength());
System.out.println("server reply : "+reply);
//步驟⑧關(guān)閉資源
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}