一.socket通信有2種,一種是基於tcp的可靠連接,一種是基於UDP的無連接包投遞服務連接,UDP通信中常用到的類有:DatagramSocket類和DatagramPacket類。
二.DatagramSocket類 表示用來發送和接收數據報包的套接字。
數據報套接字是包投遞服務的發送或接收點。每個在數據報套接字上發送或接收的包都是單獨編址和路由的。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
在 DatagramSocket 上總是啓用 UDP 廣播發送。爲了接收廣播包,應該將 DatagramSocket 綁定到通配符地址。在某些實現中,將 DatagramSocket 綁定到一個更加具體的地址時廣播包也可以被接收。
主要構造方法:
DatagramSocket
()
構造數據報套接字並將其綁定到本地主機上任何可用的端口。
DatagramSocket
(int port)
創建數據報套接字並將其綁定到本地主機上的指定端口。
主要方法有
|
receive
(
DatagramPacket
p)
從此套接字接收數據報包。 |
|
send
(
DatagramPacket
p)
從此套接字發送數據報包。 |
|
close
()
關閉此數據報套接字。 |
三.DatagramPacket類提供數據包的服務。
數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。
主要構造方法:
DatagramPacket
(byte[] buf, int length)
構造 DatagramPacket
,用來接收
長度爲 length
的數據包。
DatagramPacket
(byte[] buf, int length,
InetAddress
address, int port)
構造數據報包,用來將長度爲 length
的包發送到指定主機上的指定端口號。
主要方法:
|
getPort
()
返回某臺遠程主機的端口號,此數據報將要發往該主機或者是從該主機接收到的。 |
|
getLength
()
返回將要發送或接收到的數據的長度。 |
|
getAddress
()
返回某臺機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。 |
四.實驗代碼:
MyReceive.java
-----------------------------------------
package udp;
import java.net.*;
public class MyReceive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyReceive.receive();
}
public static void receive()
{
try{
DatagramSocket ds=new DatagramSocket(9528);//在端口9528接收數據報包的套接字
byte[] buf=new byte[100];
DatagramPacket dp=new DatagramPacket(buf,100);//創建長度爲100的數據接收包
ds.receive(dp);//套接字接受數據包
System.out.println(new String(buf,0,dp.getLength()));
//這裏接收完成,我們給發送者一條消息,告訴他發送成功了
String str="message send success!";
DatagramPacket senddp=new DatagramPacket(str.getBytes(),str.length(),
dp.getAddress(),dp.getPort());
//創建發送包
ds.send(senddp);//執行發送
ds.close();//關閉UDP套接字
}catch(Exception e)
{e.printStackTrace();}
}
}
MySend.java
---------------------------------------------------------------
package udp;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.net.*;
public class MySend {
public static void main(String[] args) {
String str = "";
try {
while (str.length() < 1) {
System.out.println("請輸入您的名字");
str = new DataInputStream(new BufferedInputStream(System.in))
.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
MySend.send(str);
}
public static void send(String str)
{
try{
DatagramSocket ds=new DatagramSocket();
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("127.0.0.1"),
9528);
ds.send(dp);
byte[] buf=new byte[100];
DatagramPacket recedp=new DatagramPacket(buf,100);
ds.receive(recedp);
System.out.println(new String(buf,0,recedp.getLength()));
ds.close();
}catch(Exception e)
{e.printStackTrace();}
}
}