1. 程式人生 > >網際網路協議以及傳送端和接收端程式示例

網際網路協議以及傳送端和接收端程式示例

InetAddress:類表示網際網路協議 (IP) 地址
 如果一個類中沒有構造方法,沒有欄位,只有成員方法?有什麼特徵
 1)應該有一些靜態功能(Math類,Arrays,Collections...)
 2)可能符合一種單例模式(餓漢/懶漢)
 3)該類中的某些靜態成員方法的返回值是該類本身

 舉例
 public class Demo{
 
 public static Demo getDemo(){
 new Demo() ;
 }
 }
 常用方法:
 public static InetAddress getByName(String host)
        throws UnknownHostException在給定主機名的情況下確定主機的 IP 地址。
        引數:

        主機名可以是機器名(如 "java.sun.com"),也可以是其 IP 地址的文字表示形式

例項程式:public class InetAddRessDemo {
public static void main(String[] args) throws UnknownHostException {

//建立InetAddress物件,通過來獲取ip地址
//在知道主機名的情況下
//InetAddress address = InetAddress.getByName("USER-20171205ZR") ;
//IP 地址的文字表示形式
//Ip地址物件
InetAddress address = InetAddress.getByName("192.168.10.1") ;

//上面獲取到了Ip地址
//public String getHostAddress()返回 IP 地址字串(以文字表現形式)。 
String ip = address.getHostAddress() ;
System.out.println(ip);//192.168.10.1
//public String getHostName()獲取此 IP 地址的主機名。
String name = address.getHostName() ;
System.out.println(name);
}

}

package org.westos_06;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;



 Udp程式設計的接收端 開發步驟:
 1)建立Socket物件
 2)建立一個數據報包(接收容器) 
 3)呼叫Socket物件中的接收的方法
 4)解析實際傳遞的資料
 5)將解析的資料(ip,資料)展示在控制檯上
 6)關閉資源
 注意:接收端不要執行多次,會出現異常:
 java.net.BindException: Address already in use: Cannot bind
 示例程式:
                public class ReceiveDemo {
public static void main(String[] args) throws IOException {

//1)建立Socket物件
//public DatagramSocket(int port)建立資料報包套接字物件並且將其繫結到本地主機上的指定埠
DatagramSocket ds = new DatagramSocket(10086);

//2)建立一個數據報包(接收容器) 
//public DatagramPacket(byte[] buf, int length)
byte[] bys = new byte[1024] ;
int len = bys.length ;
DatagramPacket dp = new DatagramPacket(bys, len) ;

//3)呼叫Socket物件中的接收的方法
//public void receive(DatagramPacket p):接收資料報包
ds.receive(dp);//阻塞式方法

//獲取ip地址文字形式
//public InetAddress getAddress() :返回ip地址物件  資料報包類:DataGramPacket
InetAddress address = dp.getAddress() ;
String ip = address.getHostAddress() ;
//4)解析實際傳遞的資料
//public byte[] getData() :獲取緩衝中實際資料(從接收容器中獲取)
byte[] bys2  = dp.getData() ;

//public int getLength()返回將要傳送或接收到的資料的長度。
int len2 = dp.getLength() ;//從接收容器中獲取包的實際長度

String data = new String(bys2, 0, len2) ;

System.out.println("當前接收到的資料是:"+data+",來自於"+ip);

//6)關閉資源
ds.close();

}}

Udp程式設計
 1)不需要建立連線通道
 2)資料大小有限制
 3)不可靠連線---->傳輸速度快!
 
 傳送端的開發步驟:
 1)建立傳送端的Socket物件
  2)建立資料,並打包
  3)呼叫當前傳送端Socket物件中的傳送的方法
  4)關閉資源
 *public static void main(String[] args) throws IOException {
///1)建立傳送端的Socket物件
//DatagramSocket:此類表示用來發送和接收資料報包的套接字。
//建立DataGramSocket物件
//構造方法
//public DatagramSocket(int port,InetAddress laddr)
//這個構造方法,裡面傳遞並不是Ip地址的文字形式
//構造資料報套接字並將其繫結到本地主機上任何可用的埠
DatagramSocket ds = new DatagramSocket() ;

 //2)建立資料,並打包
//DatagramPacket 資料報包
//DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
/**
* buf - 包資料。
offset - 包資料偏移量。
length - 包資料長度。
address - 目的地址。
port - 目的埠號。
*/
//有資料
byte[] bys = "hello,udp,我來了".getBytes() ;
//獲取包資料長度
int len = bys.length ;
//獲取ip地址物件
InetAddress address = InetAddress.getByName("192.168.10.1") ;
//指定埠號
int port = 10086 ;
DatagramPacket dp =new DatagramPacket(bys, 0, len, address, port) ;
 //3)呼叫當前傳送端Socket物件中的傳送的方法
/*public void send(DatagramPacket p)
         throws IOException從此套接字傳送資料報包*/
ds.send(dp);
 //4)關閉資源*
ds.close();
}
}