目錄
UDP傳輸
- DatagramSocket與DatagramPacket
- 建立發送端,接收端
- 建立數據包
- 調用Socket的發送接收方法
- 關閉Socket
發送端與接收端是兩個獨立的運行程序
實列一:
發送端:
/*
需求:通過UDP傳輸方式,將一段文字數據發送出去
思路:
1.建立udpsocket服務
2.提供數據,並將數據封裝到數據包中
3.通過socket服務的發送功能,將數據包發出去
4.關閉資源
*/
class UdpSend
{
public static void main(String[] args) throws Excption
{
//1.創建udp服務,8888爲指定發送端口號,不是目的端口號
DatagramSocket ds = new DatagramSocket(8888);
//2.確定數據,並封裝成數據報
byte[] buf ="udp ni hao".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10001);
//3.通過socket服務,將已有的數據包發送出去,通過send方法
ds.send(dp);
//4.關閉資源
ds.close();ds.close();
}
}
接收端:
/*
需求:定義一個應用程序,用於接收udp協議傳輸的數據並處理
思路:
1.定義udpsocket服務,通常會監聽一個端口,其實就是給這個接收網絡應用程序定義數字標識,方便於明確哪些數據過來該應用程序可以處理
2.定義一個數據包,因爲要存儲接收到的字節數據,因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息
3.通過socket服務的receive方法將收到的數據存入已定義好的數據包中
4.通過數據包對象的特有功能,將這些不同的數據取出,打印在控制檯上
5.關閉資源
*/
class UdpRece
{
public static void main(Stirng[] args) throws Exception
{
//1.創建udpSocket,建立端點,
DatagramSocket ds = new DatagramSocket(10001);
//2.定義數據包,用於存儲數據
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3.通過服務的recive方法將收到數據存入數據包中
ds.receive(dp);
//4.通過數據包的方法獲取其中的數據
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5.關閉資源
ds.close();
}
}
示例二:
上述只能發送指定的數據,如果發送鍵盤輸入的數據呢,而且是發送和接收互不干擾
發送類
/*
編寫一個聊天程序
有收數據部分,和發數據的部分
這兩部分需要同時執行,那就需要用到多線程技術,一個線程控制收,一個線程控制發
因爲收和發動作是不一致的,所以要定義兩個run方法,而且這兩個方法要封裝到不同的類中
*/
class Send implements Runnable
{
private DatagramSocket ds;
public Sent(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
string line=null;
while(line=bufr.readLine()!=null)
{
if("bye".equals(line))
break;
//255標識廣播,只要監聽10002這個端口就能收到本發送端的信息
DatagramPacket dp = new DatagramPacket (buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);
ds.send(dp);
}
}
catch(Exception e)
{
throw new RuntimeException("發送失敗");
}
}
}
接收類
class Rece implements Runnable
{
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
}
}
catch(Exception e)
{
throw new RuntimeException("接收失敗");
}
}
}
主程序
class ChatDemo
{
public static void main(String[] args)throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10002);
new Thread(new send(sendSocket)).start();
new Thread(new Rece(receSocket )).start();
}
}