網際網路協議以及傳送端和接收端程式示例
如果一個類中沒有構造方法,沒有欄位,只有成員方法?有什麼特徵
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();
}
}