1. 程式人生 > >Java基礎---網路程式設計 ip udp

Java基礎---網路程式設計 ip udp

package cn.itcast.ip;


import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;


/*
 網路程式設計:主要用於解決計算機與計算機(手機,平板)之間的資料傳輸問題。
 
 網路程式設計:不需要基於html頁面就可以達到資料之間的傳輸。比如:QQ,微信
 
 網頁程式設計:就是要基於html頁面的基礎上進行資料的互動的,比如:珍愛網,oa(辦公自動化),高考的報考系統。。
 
計算機網路:分佈在不同地域的計算機通過外部裝置連結起來達到訊息互通,資源共享的效果就稱作為一個計算機網路


網路通訊的三要素:
 1.IP
 2.埠號
 3.協議
 
     
     192.168.10.1
     
     IP地址:IP地址的本質就是一個由32位的二進位制資料組成的資料。後來別人為了方便我們記憶IO地址,就把IP地址切成4份,每份8bit。2^8=0~255
     
     00000000-00000000-00000000-00000000
     
     IP地址 = 網路號+主機號
     
     IP地址的分類:
     A類地址 = 一個網路號+三個主機號 2^24 政府單位用
     B類地址 = 兩個網路號+兩個主機號 2^16事業單位(學校,銀行。。。)
     C類地址 = 三個網路號+一個主機號 2^8 私人使用
     
   InetAddress  (IP類):
   
   常用的方法:
   getLocalhosHost()獲取本機的IP地址物件
    getByName("IP或者主機名")根據一個IP地址的字串形式或者一個主機名生成一個IP地址物件。(用於獲取別人的IP地址物件) 
   getHostAddress() 返回一個IP地址的字串表示。
   getHostName()  返回計算機的主機名
   getByName()  
   
   埠號是沒有類描述的:
     埠號的範圍:0-65535
     
     0-1023,系統緊密綁定於一些服務
     1024-49151 系統鬆散地繫結一些服務  我們可以使用的。。。
     
     常用埠號:21 FTP
         80 HTTP
         443 HTTPS
         
 網路通訊協議:
 
 UDP協議:
 
 TCP協議:
 */
public class Demo1 {


public static void main(String[] args) throws IOException {
/*// getLocalhosHost  獲取本機的IP地址物件
InetAddress address = InetAddress.getLocalHost();
System.out.println("Ip地址:"+address.getHostAddress());
System.out.println("主機名:"+address.getHostName());
*/
//獲取別人機器的IP地址物件
InetAddress address = InetAddress.getByName("192.168.15.50");
System.out.println("Ip地址:"+address.getHostAddress());
System.out.println("主機名:"+address.getHostName());

InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");//域名
}


}




package cn.itcast.udp;


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


/*
 在Java中網路通訊也稱為Socket(插座)通訊,要求通訊的兩臺機器必須要安裝socket。
 
 不同的協議就有不同的插座(Socket)
 
 UDP通訊協議的特點:
 
 1.將資料及其源和目的封裝為資料包,面向無連線。
 
2. 每個資料包大小限制在64K中
 3.因為無連線,所以不可靠
4. 因為不需要建立連結,所以速度快
5.udp通訊是不分服務端與客戶端的,只分傳送端與接收端
 
 比如:物管的對講機,飛Q聊天,遊戲。。。
 
 
 udp協議下的Socket:


DatagramSocket(udp插座服務)
DatagramPacket(資料包類)
DatagramPacket(buf, length, address, port)
buf: 傳送的資料內容
length : 傳送資料內容的大小。
address : 傳送的目的IP地址物件
port : 埠號。


傳送端的使用步驟:
1. 建立udp的服務。
2. 準備資料,把資料封裝到資料包中傳送。 傳送端的資料包要帶上ip地址與埠號。
3. 呼叫udp的服務,傳送資料。
4. 關閉資源。


 
 
 
 */
public class Demo1Sender {


public static void main(String[] args) throws IOException {
//建立udp服務
DatagramSocket datagramSocket = new DatagramSocket();
//準備資料,把資料封裝到資料包中。
String data = "這個是我的第一個udp的例子";
DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getLocalHost(),9090);

//呼叫udp的服務傳送資料包
datagramSocket.send(packet);
//關閉資源
datagramSocket.close();


}


}




package cn.itcast.udp;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
 接收端的使用步驟:
   1.建立udp的服務
   2.準備空的資料包接收資料。
   3.呼叫udp的服務接收資料
   4.關閉資源
 */
public class Demo1Receive {


public static void main(String[] args) throws IOException {
//建立udp的服務,並且要監聽一個埠。
DatagramSocket socket = new DatagramSocket(9090);

//準備空的資料包用於儲存資料。
byte[] buf = new byte[1024];
DatagramPacket datagramPacket= new DatagramPacket(buf,buf.length);
//呼叫udp服務接收資料
socket.receive(datagramPacket);//receive 是一個阻塞型的方法,沒有接收到資料之前會一直等待。資料實際上就是儲存到了byte的自己陣列中了

System.out.println("接收端接收到的資料:"+new String(buf,0,datagramPacket.getLength()));
//關閉資源
socket.close();


}


}




package cn.itcast.udp;


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


/*
 
 使用使用udp協議給飛Q傳送訊息
每個網路程式都有自己所處理的特定格式資料,如果接收到的資料不符合指定的格式,那麼就會被當成垃圾資料丟棄。(加密..) 
 飛Q接收的資料格式:
 version:time :sender : ip: flag:content ;
 版本號          時間         傳送人   :IP: 傳送的識別符號(32): 真正的內容;


 在udp協議中,有一個IP地址稱作為廣播地址,廣播地址就是主機號為255地址。


 給廣播IP地址傳送訊息的時候,在同一個網路段的機器都可以接收 到資訊。
 192.168.15.255
 */
public class FeiQDemo {


public static void main(String[] args) throws IOException {
// 建立udp的服務
DatagramSocket socket = new DatagramSocket();
// 準備資料,把資料封裝到資料包中
String data = getData("feiQ你好!");
DatagramPacket packet = new DatagramPacket(data.getBytes(),
data.getBytes().length,
InetAddress.getByName("192.168.15.255"), 2425);
// 傳送資料
socket.send(packet);
// 關閉資源
socket.close();


}


// 把資料拼接成指定格式的資料
public static String getData(String content) {
StringBuilder sb = new StringBuilder();
sb.append("1.0:");
sb.append(System.currentTimeMillis() + ":");
sb.append("習大大:");
sb.append("192.168.10.1:");
sb.append("32:");
sb.append(content);


return sb.toString();
}


}




import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;


//群聊傳送端
public class ChatSender extends Thread {

@Override
public void run() {
try {
//建立udp的服務
DatagramSocket socket = new DatagramSocket();
//準備資料,把資料封裝到資料包中傳送
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
DatagramPacket packet  = null;
while((line = keyReader.readLine())!=null){
//把資料封裝 到資料資料包中,然後傳送資料。
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.15.255"), 9090);
//把資料傳送出去
socket.send(packet);
}
//關閉 資源
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}



}




package cn.itcast.udp;


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


//群聊接收端
public class ChatReceive extends Thread {

@Override
public void run() {
try {
//建立udp的服務,要監聽一個埠
DatagramSocket socket = new DatagramSocket(9090);
//準備空的資料包儲存資料
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while(flag){
socket.receive(packet);
// packet.getAddress() 獲取對方資料 包的IP地址物件。
System.out.println(packet.getAddress().getHostAddress()+"說:"+new String(buf,0,packet.getLength()));
}
//關閉資源
socket.close();

}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


}




package cn.itcast.udp;


public class ChatMain {

public static void main(String[] args) {
ChatReceive chatReceive = new ChatReceive();
chatReceive.start();

ChatSender chatSender = new ChatSender();
chatSender.start();


}


}



package cn.itcast.udp;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;


/*
udp是一個不可靠(資料包可能會丟失)的協議




什麼情況下資料包會出現丟失呢?
1.頻寬不足 。
2.cpu的處理能力不足。




 */
public class SafeSender {

public static void main(String[] args) throws Exception {
//建立udp的服務
DatagramSocket socket = new DatagramSocket();
//準備資料,資料封裝到資料中傳送
DatagramPacket packet = null;
for(int i =  0 ; i< 10; i++){  //連續傳送10個數據包
String data =i +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
packet = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
//傳送資料包
socket.send(packet);
}
//關閉資源
socket.close();
}


}




package cn.itcast.udp;


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


public class SafeReceive {

public static void main(String[] args) throws IOException, Exception {
//建立udp的服務
DatagramSocket socket = new DatagramSocket(9090);

//建立空的資料包儲存資料
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);

//不斷接收資料包
while(true){
socket.receive(packet);
System.out.println(new String(buf,0,packet.getLength()));
Thread.sleep(10);
}



}




}