W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本節(jié)給大家?guī)鞸ocket的最后一節(jié):基于UDP協(xié)議的Socket通信,在第一節(jié)中我們已經(jīng)詳細地 比較了兩者的區(qū)別,TCP和UDP最大的區(qū)別在于是否需要客戶端與服務(wù)端建立連接后才能進行 數(shù)據(jù)傳輸,如果你學(xué)了前兩節(jié)TCP的,傳輸前先開服務(wù)端,accept,等客戶端接入,然后獲得 客戶端socket然后進行IO操作,而UDP則不用,UDP以數(shù)據(jù)報作為數(shù)據(jù)的傳輸載體,在進行傳輸時 首先要把傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(Datagram),在數(shù)據(jù)報中指明數(shù)據(jù)要到達的Socket(主機地址 和端口號),然后再將數(shù)據(jù)以數(shù)據(jù)報的形式發(fā)送出去,然后就沒有然后了,服務(wù)端收不收到我就 不知道了,除非服務(wù)端收到后又給我回一段確認的數(shù)據(jù)報~時間關(guān)系就不另外寫Android例子了 直接上Java代碼~
Step 1:創(chuàng)建DatagramSocket,指定端口號
Step 2:創(chuàng)建DatagramPacket
Step 3:接收客戶端發(fā)送的數(shù)據(jù)信息
Step 4:讀取數(shù)據(jù)
示例代碼:
public class UPDServer {
public static void main(String[] args) throws IOException {
/*
* 接收客戶端發(fā)送的數(shù)據(jù)
*/
// 1.創(chuàng)建服務(wù)器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(12345);
// 2.創(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);
// 3.接收客戶端發(fā)送的數(shù)據(jù)
System.out.println("****服務(wù)器端已經(jīng)啟動,等待客戶端發(fā)送數(shù)據(jù)");
socket.receive(packet);// 此方法在接收到數(shù)據(jù)報之前會一直阻塞
// 4.讀取數(shù)據(jù)
String info = new String(data, 0, packet.getLength());
System.out.println("我是服務(wù)器,客戶端說:" + info);
/*
* 向客戶端響應(yīng)數(shù)據(jù)
*/
// 1.定義客戶端的地址、端口號、數(shù)據(jù)
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "歡迎您!".getBytes();
// 2.創(chuàng)建數(shù)據(jù)報,包含響應(yīng)的數(shù)據(jù)信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.響應(yīng)客戶端
socket.send(packet2);
// 4.關(guān)閉資源
socket.close();
}
}
Step 1:定義發(fā)送信息
Step 2:創(chuàng)建DatagramPacket,包含將要發(fā)送的信息
Step 3:創(chuàng)建DatagramSocket
Step 4:發(fā)送數(shù)據(jù)
public class UDPClient {
public static void main(String[] args) throws IOException {
/*
* 向服務(wù)器端發(fā)送數(shù)據(jù)
*/
// 1.定義服務(wù)器的地址、端口號、數(shù)據(jù)
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用戶名:admin;密碼:123".getBytes();
// 2.創(chuàng)建數(shù)據(jù)報,包含發(fā)送的數(shù)據(jù)信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.創(chuàng)建DatagramSocket對象
DatagramSocket socket = new DatagramSocket();
// 4.向服務(wù)器端發(fā)送數(shù)據(jù)報
socket.send(packet);
/*
* 接收服務(wù)器端響應(yīng)的數(shù)據(jù)
*/
// 1.創(chuàng)建數(shù)據(jù)報,用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收服務(wù)器響應(yīng)的數(shù)據(jù)
socket.receive(packet2);
// 3.讀取數(shù)據(jù)
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客戶端,服務(wù)器說:" + reply);
// 4.關(guān)閉資源
socket.close();
}
}
本節(jié)內(nèi)容比較簡單,無非就是將數(shù)據(jù)轉(zhuǎn)換為字節(jié),然后放到DatagramPacket(數(shù)據(jù)報包中),發(fā)送的 時候帶上接受者的IP地址和端口號,而接收時,用一個字節(jié)數(shù)組來緩存!發(fā)送的時候需要創(chuàng)建一個 DatagramSocket(端到端通信的類)對象,然后調(diào)用send方法給接受者發(fā)送數(shù)據(jù)報包~ 本節(jié)代碼來源于慕客網(wǎng)上的一個JavaSocket教程~有興趣的可以看看: Java Socket應(yīng)用---通信是這樣練成的
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: