一、概述
目的:網絡通信:
1、設備和設備
2、進程和進程
? 1)不同設備之間
? 2)本地設備之間
需要解決的問題:
如何準確地發送到對方的主機 - IP地址 - 唯一的定位網絡中的一臺主機
如何準確的發送到對方主機的進程 - 端口
找到主機后如何可靠高效地進行數據傳輸,要能看懂 - 協議 - 規定/標準
二、網絡通信要素
如何實現網絡中的主機互相通信?
~一定的規則(即:網絡通信協議。有兩套參考模型)
? OSI參考模型
?TCP/IP參考模型(或TCP/IP協議)
~通信雙方地址
IP地址
端口號
2.1、網絡協議:
一種規則,人與人交流有語言的規則,計算機之間通過網絡交流也要有網絡的規則。
2.1.1、OSI參考模型
模型過于理想化,未能在因特網上進行廣泛推廣?
2.1.2、TCP\IP協議
?出現較早,事實上的標準。
兩種協議之間存在對應關系:
傳輸控制協議(TCP)和網絡互聯協議(IP),一組協議,不同功能互相關聯
2.1.3、TCP和UDP
TCP協議:
使用TCP協議前,須先建立TCP連接,形成傳輸數據通道;
傳輸前,采用三次握手方式,是可靠的;
TCP協議進行通信的兩個應用進程:客戶端、服務端;
在連接中可進行大數據量的傳輸;
傳輸完畢,使用四次揮手方式,釋放連接,結束傳輸,效率低。
UDP協議:
將數據、源、目的封裝成數據包,不需要建立連接;
每個數據報的大小限制在64KB內;
因無需連接,故是不可靠的;
發送數據結束時無需釋放資源,速度快。
三次握手過程:
四次揮手過程
?2.2、IP地址和端口號
2.2.1、IP地址
唯一的標識Internet上的計算機(通信實體)
分類:
IPV4:4個字節組成,4個0~255,如192.168.0.1
IPV6:128位(16個字節),寫成8個無符號整數,每個整數用四個十六進制表示
如:3ffe:3201:1401:1280:c8ff:fe4d:db39:198
2.2.2、端口號省略。。。
三、TCP編程_服務器和客戶端
目標:
1、客戶端能夠連接服務器
2、客戶端能夠給服務器發送字符串并在服務器的控制臺打印,直到發送exit表示發送結束
這里見源碼及其注釋:
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*
* 服務器
* */
public class Server {public static void main(String[] args) throws IOException {//創建監聽套接字 最大端口65535ServerSocket serverSocket = new ServerSocket(60000);while (true) {//創建已連接套接字 - 返回表示有客戶端連接Socket socket = serverSocket.accept();//獲取客戶端的IP和端口System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "已連接");int len = 0;byte[] arr = new byte[1024];//IO操作InputStream in = socket.getInputStream();while(true) {len = in.read(arr, 0, arr.length);if(len == -1) {break;}//byte[] --> StringString s = new String(arr, 0, len);System.out.println(s);}//關閉socket.close();}}
}
package day31;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);//創建套接字 -- 如果成功表示和服務器連接成功Socket socket = new Socket("127.0.0.1", 60000);//IO操作OutputStream out = socket.getOutputStream();while(true) {//獲取用戶輸入String s = sc.next();if(s.equals("exit")) {break;}//將輸入的數據發送給服務器out.write(s.getBytes());}//關閉socket.close();}
}