【网络编程】Socket网络编程基础
文章目錄
- 網絡編程概述
- Socket與TCP UDP
- Socket TCP演示
- 報文段
- 協議
- Mac地址
- IP、端口、遠程服務器
- IPv4
- IPv6
- 端口
- 遠程服務器
網絡編程概述
什么是網絡編程
網絡編程從大的方面說就是對信息的發送到接收
通過操作相應Api調度計算機硬件資源,并利用傳輸管道(網線)進行數據交換的過程
更為具體的涉及:網絡模型、套接字、數據包
網絡模型 – 對應關系
具體細節看一看我的 專欄《計算機網絡》
Socket與TCP UDP
關于Socket
簡單來說是IP地址與端口的結合協議(RFC793)
一種地址與端口的結合描述協議
TCP/IP協議的相關API的總稱;是網絡Api的集合實現
涵蓋了:Stream Socket/Datagram Socket
Socket的作用與組成
在網絡傳輸中用于唯一標示兩個端點之間的鏈接
端點:包括(IP+Port)
4個要素:客戶端地址、客戶端端口、服務器地址、服務器端口
Socket 傳輸原理
Socket – TCP
TCP是面向連接的通信協議
通過三次握手建立連接,通訊完成時要拆除連接
由于TCP是面向連接的所以只能用于端到端的通訊
Socket – UDP
UDP是面向無連接的通訊協議
UDP數據包括目的端口號和源端口號信息
由于通訊不需要連接,所以可以實現廣播發送,并不局限于端到端
TCP 傳輸
UDP傳輸
Client-Server Application
TCP/IP協議中,兩個進程間通信的主要模式為:CS模型
主要目的:協同網絡中的計算機資源、服務模式、進程間數據共享
常見的:FTP、SMTP、HTTP
Socket TCP演示
構建TCP客戶端、服務端
客戶端發送數據
服務器讀取數據并打印
創建一個默認文件夾
服務器端
Server.java
Client.java
import java.io.*; import java.net.*;public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket();//超時時間socket.setSoTimeout(3000);//連接本地 端口號2000 超時時間是3000mssocket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);// public void connect(SocketAddress endpoint, int timeout)//socket地址 = ip + 端口號System.out.println("已發起服務器連接,并進入后續流程~~~");System.out.println("客戶端信息:"+socket.getLocalAddress()+" port:"+socket.getLocalPort());System.out.println("服務器信息"+socket.getInetAddress()+" port:"+socket.getPort());try {todo(socket); //發送接收數據}catch (Exception e){System.out.println("異常退出");}socket.close();System.out.println("客戶端已退出");}private static void todo(Socket client) throws IOException {InputStream in = System.in; //鍵盤輸入流BufferedReader input = new BufferedReader(new InputStreamReader(in));//得到Socket輸出流 并轉換為打印流OutputStream outputStream = client.getOutputStream();PrintStream socketPrintStream = new PrintStream(outputStream);//得到Socket輸入流 并轉換為BufferedReaderInputStream inputStream = client.getInputStream();BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));boolean flag = true;do{//讀取一行String string = input.readLine();//發送到服務器socketPrintStream.println(string);//從服務器讀取一行String echo = socketBufferedReader.readLine();if ("bye".equalsIgnoreCase(echo)){flag = false;}else {System.out.println(echo);}}while (flag);//釋放資源socketBufferedReader.close();socketPrintStream.close();} }啟動服務器端(服務器端窗口)
啟動客戶端(客戶端窗口)
服務器端窗口 變化:
在客戶端窗口 輸入“Hello”
服務器端變化
輸入bye
重新運行客戶端 服務器端又會接入新的連接
按過程分析:
最初的時候,準備服務器
關于ServerSocket類 查閱API
再看看它的構造方法:
加上端口之后 我們的服務器套接字就完成了
System.out.println("服務器準備就緒!");System.out.println("服務器信息:"+server.getInetAddress()+" p: "+server.getLocalPort());
接著 我們打印了一些相關的信息 來探究這個過程中發生了什么 我們需要關注ServerSocket類 的方法
當然這一步并不是必要的,這里只是演示需要
重要的是 服務器套接字完成之后,需要等待客戶端連接 這里就需要去監聽來自客戶端連接的消息了 就是下面的內容
Socket client = server.accept(); //監聽連接到一個客戶端//客戶端構建異步線程
它的返回值 是Socket (客戶端套接字)
我們來看看 Socket類的情況
下面轉入客戶端的情況
Socket socket = new Socket();//超時時間socket.setSoTimeout(3000);首先建立起Socket的實現類 socket
此時的socket類 還沒有相關的配置信息
我們為它設置去連接客戶端的超時時間 單位是毫秒
下面配置連接的情況
關于SocketAddress
它是一個抽象類
我們來看它的直接子類 也就是我們new出來的東西:
關注它的構造方法:
我們通過它們 實現與服務器的連接
//socket地址 = ip + 端口號System.out.println("已發起服務器連接,并進入后續流程~~~");System.out.println("客戶端信息:"+socket.getLocalAddress()+" port:"+socket.getLocalPort());System.out.println("服務器信息"+socket.getInetAddress()+" port:"+socket.getPort());
下面我們打印 演示的信息
演示中 我們在控制臺輸入字符串,非bye的話 服務器接收并且進行打印
我們看看我們這邊的處理方式
鍵盤輸入流 轉成緩沖流
//得到Socket輸出流 并轉換為打印流OutputStream outputStream = client.getOutputStream();PrintStream socketPrintStream = new PrintStream(outputStream);
得到Socket輸出流 并轉換為打印流 打印輸出流的流向和該套接字一樣
接下來讀取自己在控制臺輸入的字符串
發送到服務器
服務器接收客戶端的消息
//得到打印流,用于數據輸出;服務器回送數據使用PrintStream socketOutput = new PrintStream(socket.getOutputStream());//得到輸入流,用于接收數據BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));得到打印流 然后轉換成緩沖流
接著讀取消息
我們打印到控制臺 然后可以給客戶端回復消息
剩下的就基本上沒什么好解釋的了。
報文段
報文段是指TCP/IP協議網絡傳輸過程中,起著路由導航作用
用以查詢各個網絡路由網段、IP地址、交換協議等IP數據包
報文段充當整個TCP/IP協議數據包的導航路由功能
報文在傳輸過程中會不斷地封裝成分組、包、幀來傳輸
封裝方式就是添加一些控制信息組成的首部,即報文頭
協議
傳輸協議
協議顧名思義,一種規定,約束
約定大于配置,在網絡傳輸中依然適用;網絡的傳輸流程是健壯的穩定的,得益于基礎的協議構成
簡單來說:A->B的傳輸數據,B能識別,反之B->A的傳輸數據A也能識別,這就是協議
Mac地址
Media Access Control或者Medium Access Control
意譯為媒體訪問控制,或稱為物理地址、硬件地址
用來定義網絡設備的位置
形如:44-45-53-54-00-00;與身份證類似
IP、端口、遠程服務器
IPv4
IP互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),縮寫為IP地址(英語:IP Address)
是分配給網絡上使用網際協議(英語:Internet Protocol,IP)的設備的數字標簽
常見的IP地址分為IPv4與IPv6兩大類
IP地址由32位二進制數組成,常以XXX.XXX.XXX.XXX形式表現,每組XXX代表小于或等于255的10進制數 如:208.80.152.2
如果主機號是全1,那么這個地址為直接廣播地址
IP地址“255.255.255.255”為受限廣播地址
IPv6
總共有128位長,IPV6地址的表達形式,一般采用32個十六進制數。
也可以想象為1632個
由兩個邏輯部分組成:一個64位的網絡前綴和一個64位的主機地址,主機地址通常根據物理地址自動生成,叫做EUI-64(或者64-位擴展唯一標識) 比如:2001:0db8:85a3:0000:1319:8a2e:0370:7344
IPv4轉換為IPv6一定可行,IPv6轉換為IPv4不一定可行
端口
如果把IP地址比作一間房子,端口就是出入這間房子的門或者窗戶
在不同門窗戶后有不同的人,房子中的用戶與外界交流的出口
外界鴿子(信息)飛到不同窗戶也就是給不同的人傳遞信息
0到1023號端口以及1024到49151號端口都是特殊端口
特殊端口號
計算機之間依照互聯網傳輸層TCP/IP協議的協議通信,不同的協議都對應不同的端口
49152到65535號端口屬于“動態端口”范圍,沒有端口可以被正式地注冊占用
傳輸層次
這里僅僅是簡單復習
關于報文的情況 打算寫一篇博文 全面講解這些東西
遠程服務器
局域網:一般而言,家里的環境以及公司相互電腦之間環境都屬于局域網
我與你們的電腦之間屬于互聯網,而非局域網
默認的:我的電腦無法直接鏈接到你們的電腦
Web請求流程
總結
以上是生活随笔為你收集整理的【网络编程】Socket网络编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 频率域平滑滤波器
- 下一篇: java学习(86):Interage方