1? ? ? 網絡編程----UDPNo25
【Scanner scanner =new Scanner(System.in);
try {
DatagramSockets = newDatagramSocket(8888);
String line =scanner.nextLine();
byte[] bytes =line.getBytes();//把用戶輸入的字符串拆成字節(jié)數(shù)組
//把字節(jié)數(shù)組塞進包里,寫上對方的地址和端口
try {
DatagramPacketp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("127.0.0.1"),9999);
s.send(p);//發(fā)送包裹
s.close();
scanner.close();
DatagramSockets = new DatagramSocket(9999);
byte[] bytes = newbyte[1024];
DatagramPacket p =new DatagramPacket(bytes, bytes.length);//準備空包
s.receive(p);//接收,空包裹被填滿
String str = newString(bytes,0,p.getLength()); //用字節(jié)數(shù)組的有效數(shù)據組裝回字符串
System.out.println(str);
s.close();
】
2:bytes
【
DatagramSocket s =new DatagramSocket(9999);
byte[] bytes = newbyte[128];//用于存放接收數(shù)據的數(shù)組
//用于存放接收數(shù)據的空數(shù)據報包,字節(jié)數(shù)組放置其中
DatagramPacket p =new DatagramPacket(bytes, bytes.length);
s.receive(p);//接收其他收發(fā)站發(fā)來的數(shù)據,阻塞方法,收到才返回
for(int i=0;i
System.out.println(bytes[i]);? //下標為0,1,2,3
}
s.close();//關閉收發(fā)站
DatagramSocket s =new DatagramSocket(8888);//在8888上建立收發(fā)站
byte[] bytes = { 1,2, 3 };//要發(fā)送的數(shù)據
//建立一個包,把要發(fā)送的數(shù)據塞進去,寫上對方的地址和端口9999
DatagramPacket p =new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("127.0.0.1"),9999);
s.send(p);
s.close();//關閉收發(fā)站
】
UDP UserDatagram Protocol用戶數(shù)據報協(xié)議
也是傳輸層的一個協(xié)議,信息傳輸時不需要連接,不可靠,效率較高
Java進行UDP通信:
DatagramSocket相當于一個收發(fā)站(信息發(fā)送站)
構造方法:DatagramSocket(int port)在port端口上建立收發(fā)站
send(DatagramPacketp)發(fā)送數(shù)據報包
receive(DatagramPacketp)接受數(shù)據報包,阻塞方法,一旦收到對象發(fā)過來的包,這個DatagramPacket中的存放數(shù)據的字節(jié)數(shù)組就會自動填充對方發(fā)過來的信息
DatagramPacket數(shù)據報包,收發(fā)站要進行收發(fā)的包(信息接收站)
構造方法:
一、發(fā)送的包:
DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一個參數(shù)表示字節(jié)數(shù)組形式的發(fā)送數(shù)據,第二個參數(shù)是包的長度,一般是字節(jié)數(shù)組的長度,第三個參數(shù)是接收方的地址,第四個參數(shù)接收方的端口)
二、接收的包:
DatagramPacket(byte[]bytes,int len)
第一個參數(shù)是存放接收數(shù)據的數(shù)組,第二個是接收數(shù)據的長度
getLength()獲取包的有效長度
InetAddress.getByName(Stringaddress)根據字符串生成一個地址對象
getAddress()獲得一個InetAddress對象,表示發(fā)送方地址,再調用這個對象的getHostAddress()獲取字符串形式的地址
int getPort()獲取端口號
【
DatagramSocket類:《此類表示用來發(fā)送和接收數(shù)據報包的套接字;特點:既能發(fā)送又能接收》
DatagramPacket類:《此類表示數(shù)據報包。數(shù)據報包用來實現(xiàn)無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器?!?/b>
使用步驟:【發(fā)送端:《1、創(chuàng)建套接字對象???? 2、封裝數(shù)據報包
3、發(fā)送數(shù)據報包?????? 4、釋放資源》
【接收端:《1、創(chuàng)建套接字對象???? 2、創(chuàng)建數(shù)據報包,用于接收數(shù)據
1、 通過receive方法接收數(shù)據并保存到數(shù)據報包中? 4、釋放資源》
示例代碼:
發(fā)送端《
publicclass SendDemo {
public static void main(String[] args)throws Exception{
// UDP的發(fā)送端
System.out.println("UDP發(fā)送端開啟.....");
// 創(chuàng)建Socket對象
DatagramSocket socket = newDatagramSocket();
// 創(chuàng)建數(shù)據報包
byte[] buf = "來自udp發(fā)送端的數(shù)據".getBytes();
DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,
InetAddress.getLocalHost(),6666);
//發(fā)送數(shù)據
socket.send(packet);
//釋放資源
socket.close();
System.out.println("UDP發(fā)送端關閉.....");
}
}
》
接收端《
publicclass ReceiveDemo {
public static void main(String[] args)throws Exception {
// udp接收端
System.out.println("UDP接收端開啟.....");
//創(chuàng)建Socket對象
DatagramSocket socket = newDatagramSocket(6666);
//創(chuàng)建一個空的字節(jié)數(shù)組,是真正保存接收數(shù)據的容器
byte[] buf = newbyte[65536];//1024*64=65536
//創(chuàng)建一個空的數(shù)據報包,用于接收來自發(fā)送端的數(shù)據
DatagramPacket packet = newDatagramPacket(buf, buf.length);
//阻塞式方法,接收數(shù)據,將接收到的數(shù)據保存到指定的數(shù)據報包中
socket.receive(packet);
//從數(shù)據報包中獲取數(shù)據
String ip =packet.getAddress().getHostAddress();
//?????????????? packet.getData()
//接收數(shù)據
String data = new String(buf,0, buf.length);
System.out.println("接收到來自"+ip+"的數(shù)據"+data);
System.out.println("UDP接收端關閉.....");
//釋放資源
socket.close();
}
}
》
】
【
練習:使用UDP協(xié)議實現(xiàn)一個DOS版的簡易聊天室
publicclass UdpExercise {
public static void main(String[] args){
// TODO Auto-generated methodstub
//開啟接收消息的線程
new Thread(newReceiveMsg()).start();
//開啟一個發(fā)送消息的線程
new Thread(newSendMsg()).start();
}
}
//UDP接收器
class ReceiveMsg implements Runnable{
@Override
public void run() {
// TODOAuto-generated method stub
DatagramSocketsocket = null;
try {
socket =new DatagramSocket(8888);
for(;;){
byte[]buf = new byte[1024];
DatagramPacketpacket = new DatagramPacket(buf, buf.length);
socket.receive(packet);
Stringip = packet.getAddress().getHostAddress();
Stringdata = new String(buf, 0, packet.getLength());
System.out.println(ip+":"+data);
}
} catch(SocketException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch (IOExceptione) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
if(socket!=null){
socket.close();
socket=null;
}
}
}
}
//udp發(fā)送器
class SendMsg implements Runnable {
DatagramSocket socket = null;
@Override
public void run() {
// TODOAuto-generated method stub
try {
socket =new DatagramSocket();
BufferedReaderbr = new BufferedReader(new InputStreamReader(
System.in));
String line= null;
while((line = br.readLine()) != null) {
byte[]buf = line.getBytes();
DatagramPacketpacket = new DatagramPacket(buf, 0,
buf.length,InetAddress.getByName("192.168.95.255"),
8888);
socket.send(packet);
}
} catch (Exceptione) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
if(socket!= null){
socket.close();
socket= null;
}
}
}
}
】