基本概念
- 網絡編程 : 網絡編程主要用于解決計算機與計算機(手機秃症、平板..)之間的數據傳輸問題
- 網絡編程 : 不需要基于html頁面就可以達到數據之間的傳輸种柑。 比如: feiQ , QQ , 微信....
- 網頁編程 : 就是要基于html頁面的基礎上進行數據的交互的。 比如: 珍愛網荠雕、 oa(辦公自動化)、 高考的報告系統(tǒng)...
- 計算機網絡 : 分布在不同地域 的計算機通過外部設備鏈接起來達到了消息互通欢际、資源共享的效果就稱作為一個計算機網絡矾兜。
- 網絡通訊的三要素:
- IP (192.168.10.1)
- 端口號
- 協議
IP
- IP地址 : IP地址的本質就是一個由32位的二進制數據組成的數據患久。 后來別人為了方便我們記憶IP地址, 就把IP地址切成了4份, 每份8bit (2^8 = 0~255) // ipconfig->win獲取IP地址
00000000-00000000-00000000-00000000 - IP地址 = 網絡號+ 主機號
- IP地址的分類 :
- A類地址 = 一個網絡號 + 三個主機號 -> (2^24 政府單位)
- B類地址 = 兩個網絡號 + 兩個主機號 -> (2^16 事業(yè)單位(學校蒋失、銀行..))
- C類地址 = 三個網絡號 + 一個主機號 -> (2^8 私人使用..)
- InetAddress(IP類)常用的方法:
- getLocalHost(); 獲取本機的IP地址
- getByName("IP或者主機名") 根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。 (用于獲取別人的IP地址對象)
- getHostAddress() 返回一個IP地址的字符串表示形式
- getHostName() 返回計算機的主機名
- 子網掩碼的作用: 用來表明IP地址哪一個是網絡號, 哪一個是主機號
端口
- 端口號是沒有類描述的, 端口號的范圍: 0~65535
- 0~1023 : 系統(tǒng)緊密綁定于一些服務
- 1024~65535 : 我們可以使用....
通訊協議
- 網絡通訊的協議:
- udp通訊協議
- tcp通訊協議
public class Demo {
public static void main(String[] args) throws UnknownHostException {
//getLocalHost 獲取本機的IP地址對象
/*InetAddress address = InetAddress.getLocalHost();
System.out.println("IP地址:"+address.getHostAddress());
System.out.println("主機名:"+address.getHostName());*/
//獲取別人機器的IP地址對象
//可以根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。
InetAddress address = InetAddress.getByName("Jolly-pc140116");
System.out.println("IP地址:"+address.getHostAddress());
System.out.println("主機名:"+address.getHostName());
InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");//域名
}
}
UDP
在java中網絡通訊業(yè)稱作為Socket(插座)通訊链韭,要求通訊 的兩臺器都必須要安裝Socket; 不同的協議就有不同的插座(Socket)
-
UDP通訊協議的特點:
- 將數據極封裝為數據包煮落,面向無連接
- 每個數據包大小限制在64K中
3.因為無連接,所以不可靠 - 因為不需要建立連接旋讹,所以速度快
- UDP通訊是不分服務端與客戶端的轿衔,只分發(fā)送端與接收端
<比如 : 物管的對講機, 飛Q聊天、 游戲...
-
UDP協議下的Socket:
- DatagramSocket (UDP插座服務)
- DatagramPacket (數據包類)
- DatagramPacket(buf, length, address, port)
- buf: 發(fā)送的數據內容
- length : 發(fā)送數據內容的大小
- address : 發(fā)送的目的IP地址對象
- port : 端口號
- DatagramPacket(buf, length, address, port)
-
發(fā)送端的使用步驟:
- 建立UDP的服務
- 準備數據害驹,把數據封裝到數據包中發(fā)送, 發(fā)送端的數據包要帶上ip地址與端口號
- 調用UDP的服務裙秋,發(fā)送數據
- 關閉資源
public class Demo1Sender {
public static void main(String[] args) throws IOException {
//建立udp的服務
DatagramSocket datagramSocket = new DatagramSocket();
//準備數據,把數據封裝到數據包中进宝。
String data = "第一個udp的例子..";
//創(chuàng)建了一個數據包
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length,InetAddress.getLocalHost() , 9090);
//調用udp的服務發(fā)送數據包
datagramSocket.send(packet);
//關閉資源 ---實際上就是釋放占用的端口號
datagramSocket.close();
}
}
- 接收端的使用步驟
- 建立udp的服務
- 準備空 的數據 包接收數據枷恕。
- 調用udp的服務接收數據。
- 關閉資源
public class Demo1Receive {
public static void main(String[] args) throws IOException {
//建立udp的服務 未玻,并且要監(jiān)聽一個端口扳剿。
DatagramSocket socket = new DatagramSocket(9090);
//準備空的數據包用于存放數據。
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); // 1024
//調用udp的服務接收數據
socket.receive(datagramPacket); //receive是一個阻塞型的方法锡搜,沒有接收到數據包之前會一直等待瞧掺。 數據實際上就是存儲到了byte的自己數組中了。
System.out.println("接收端接收到的數據:"+ new String(buf,0,datagramPacket.getLength())); // getLength() 獲取數據包存儲了幾個字節(jié)肠缔。
//關閉資源
socket.close();
}
}
- 注意 : 如何使用tem運行一個java程序: 進入目錄, 報名+類型運行文件
eg: java my.UdpSender
TCP
-
TCP通訊協議特點:
- tcp是基于IO流進行數據 的傳輸 的哼转,面向連接
- tcp進行數據傳輸的時候是沒有大小限制的
- tcp是面向連接释簿,通過三次握手的機制保證數據的完整性。 可靠協議
- tcp是面向連接的庶溶,所以速度慢
- tcp是區(qū)分客戶端與服務端的
比如 : 打電話偏螺、 QQ\feiQ的文件傳輸、 迅雷下載....
-
tcp協議下的Socket:
- Socket(客戶端) : tcp的客戶端一旦啟動馬上要與服務端進行連接
- ServerSocket(服務端類)
-
tcp的客戶端使用步驟:
- 建立tcp的客戶端服務
- 獲取到對應的流對象
3.寫出或讀取數據 - 關閉資源
//tcp客戶端
public class DemoClinet {
public static void main(String[] args) throws IOException{
//建立tcp的服務
Socket socket = new Socket(InetAddress.getLocalHost(),9090);
//獲取到Socket的輸出流對象
OutputStream outputStream = socket.getOutputStream();
//利用輸出流對象把數據寫出即可酿联。
outputStream.write("服務端你好".getBytes());
//獲取到輸入流對象夺巩,讀取服務端回送的數據柳譬。
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int length = inputStream.read(buf);
System.out.println("客戶端接收到的數據:"+ new String(buf,0,length));
//關閉資源
socket.close();
}
}
tcp的服務端
java.net.BindException: 端口被占用
-
ServerSocket的使用步驟
- 建立tcp服務端 的服務
- 接受客戶端的連接產生一個Socket
- 獲取對應的流對象讀取或者寫出數據
- 關閉資源
為什么ServerSocket不設計一個 getInputStream 與 getOutputStream 呢?
服務端是可以接受多用戶請求的, 如果設計getInputStream 與 getOutputStream方法, 那么多用戶所接受的信息將是相同的, 所以沒有設計getInputStream 與 getOutputStream方法
//服務端
public class DemoServer {
public static void main(String[] args) throws Exception {
//建立Tcp的服務端,并且監(jiān)聽一個端口销部。
ServerSocket serverSocket = new ServerSocket(9090);
//接受客戶端的連接
Socket socket = serverSocket.accept(); //accept() 接受客戶端的連接 該方法也是一個阻塞型的方法舅桩,沒有客戶端與其連接時,會一直等待下去擂涛。
//獲取輸入流對象歼指,讀取客戶端發(fā)送的內容甥雕。
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int length = 0;
length = inputStream.read(buf);
System.out.println("服務端接收:"+ new String(buf,0,length));
//獲取socket輸出流對象,想客戶端發(fā)送數據
OutputStream outputStream = socket.getOutputStream();
outputStream.write("客戶端你好靶琛峭弟!".getBytes());
//關閉資源
serverSocket.close();
}
}
模擬Tomcat服務器
public class TomcatDemo extends Thread {
Socket socket;
public TomcatDemo(Socket socket){
this.socket = socket;
}
public void run() {
try {
//獲取socket的輸出流對象
OutputStream outputStream = socket.getOutputStream();
//把數據寫到瀏覽器上
outputStream.write("<html><head><title>aaa</title></head><body>你好啊瀏覽器</body></html>".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
//建立tcp的服務端
ServerSocket serverSocket = new ServerSocket(9090);
//不斷的接受客戶端的連接
while(true){
Socket socket = serverSocket.accept();
new TomcatDemo(socket).start();
}
}
}