java网络编程udp_Java网络编程之UDP
UDP是User Datagram Protocol的簡(jiǎn)稱,中文名是用戶數(shù)據(jù)報(bào)協(xié)議,是OSI(Open System Interconnection,開(kāi)放式系統(tǒng)互聯(lián))參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù),IETF RFC 768是UDP的正式規(guī)范。
UDP的特征:
不需要建立連接,將數(shù)據(jù)及相關(guān)的地址都封裝到數(shù)據(jù)包中
每個(gè)數(shù)據(jù)包的大小限制在64k
不需要建立連接,所以效率比較高,正因?yàn)椴恍枰B接所以是不可靠協(xié)議
Socket
Socket就是為網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制
通信的兩端都有Socket
網(wǎng)絡(luò)通訊其實(shí)就是Socket通信
數(shù)據(jù)在兩個(gè)Socket間進(jìn)行傳輸
Java中使用UDP的步驟
發(fā)送端
建立UDP的socket服務(wù)
封裝數(shù)據(jù)包(指明接收端的IP地址,和接收端的端口號(hào))
通過(guò)socket的Send()發(fā)送數(shù)據(jù)
關(guān)閉服務(wù)
接收端
創(chuàng)建socket服務(wù)(需要指明監(jiān)視的端口號(hào),并且要和發(fā)送端指定的接受端口的端口號(hào)一致)
定義數(shù)據(jù)包用于接收數(shù)據(jù)(構(gòu)建DatagramPacket packet用于接收數(shù)據(jù))
通過(guò)socket的Receiver()接受數(shù)據(jù)
通過(guò)packet提供的相應(yīng)方法獲取發(fā)送端發(fā)送的信息
關(guān)閉服務(wù)
代碼案例如下
發(fā)送端
package cc.enfp.socket.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
* UDP 發(fā)送端程序
*/
public class SendTest
{
public static void main(String[] args) throws IOException
{
/*
* 1、創(chuàng)建socket服務(wù)
*/
DatagramSocket socket = new DatagramSocket();
/*
* 2、提供相應(yīng)的發(fā)送=信息
*/
byte[] data = "開(kāi)啟udp之旅".getBytes();
//指明接收端的IP地址,和接收端的端口號(hào)
DatagramPacket packet = new DatagramPacket(data, data.length,
InetAddress.getLocalHost(), 10000);
/*
* 3、使用socket的發(fā)送方法,進(jìn)行數(shù)據(jù)的發(fā)送
*/
socket.send(packet);
/*
* 4、關(guān)閉連接,釋放資源
*/
socket.close();
}
}
接收端
package cc.enfp.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
* UDP 接收端
*/
public class ReceiveTest
{
public static void main(String[] args) throws Exception
{
/*
* 1、創(chuàng)建socket服務(wù)
* 需要指明監(jiān)視的端口號(hào),并且要和發(fā)送端指定的接受端口的端口號(hào)一致
*/
DatagramSocket socket = new DatagramSocket(10000);
/*
* 2、構(gòu)建DatagramPacket packet用于接收數(shù)據(jù)
* packet只是為了接受數(shù)據(jù),所以只需要指明字節(jié)數(shù)組和長(zhǎng)度就可以
*/
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
/*
* 3、通過(guò)socket的receive方法將數(shù)據(jù)封裝到packet中
*/
socket.receive(packet);//該方法是阻塞
/*
* 4、通過(guò)packet提供的相應(yīng)方法獲取發(fā)送端發(fā)送的信息
*/
InetAddress ip = packet.getAddress();
System.out.println("發(fā)送端的IP: "+ip.getHostAddress());
//使用String的重載將返回的byte[]類(lèi)型的內(nèi)容轉(zhuǎn)換成字符串
String content = new String(packet.getData(), 0, packet.getLength());
System.out.println("發(fā)送端發(fā)送的內(nèi)容為: "+content);
/*
* 5.關(guān)閉連接,釋放資源
*/
socket.close();
}
}
總結(jié)
以上是生活随笔為你收集整理的java网络编程udp_Java网络编程之UDP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java外部类调用内部类_java中的外
- 下一篇: java美元兑换,(Java实现) 美元