Java基礎---網路程式設計 ip udp
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 {
/*// 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("主機名:"+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);
}
}
}