java面试题32:Java网络程序设计中,下列正确的描述是()
java面試題32:Java網絡程序設計中,下列正確的描述是()
A:Java網絡編程API建立在Socket基礎之上 B:Java網絡接口只支持tcP以及其上層協議 C:Java網絡接口只支持UDP以及其上層協議 D:Java網絡接口支持IP以上的所有高層協議蒙蔽樹上蒙蔽果,蒙蔽樹下你和我。不多說了,先看看網絡編程。
一、網絡編程基礎概念
首先理清一個概念:網絡編程不等于網站編程,網絡編程即使用套接字來達到進程間通信,現在一般稱為TCP/IP編程。
計算機網絡:
把分布在不同地理區域的計算機與專門的外部設備用通信線路互連成一個規模大,功能強的網絡系統,從而使眾多的計算機可以方便的互相傳遞信息,共享硬件,軟件,數據信息等資源。
計算機網絡的主要功能:
??? 資源共享
??? 信息傳輸與集中處理
??? 均衡負荷與分布處理
??? 綜合信息服務(www / 綜合業務數字網絡 ISDN)
計算機網絡三高問題: 高并發,高性能,高可用。
計算機網絡分類:
??? 局域網
??? 城域網
??? 廣域網
??? 互聯網
??? 等等…
(Local Area Network;LAN) 通常我們常見的“LAN”就是指局域網,這是我們最常見、應用最廣的一種網絡
二、網絡通信協議及接口
網絡通信協議:
計算機網絡中實現通信必須有一些約定,即通信協議;包括對速率,傳輸代碼,代碼結構,傳輸控制步驟,出錯控制等制定的標準。
網絡通信接口:
為了使兩個節點之間能進行對話,必須在他們之間建立通信工具(即接口),使彼此之間,能進行信息交換。接口包括兩部分:
??? 硬件裝置:實現結點之間的信息傳送
??? 軟件裝置:規定雙方進行通信的約定協議
三、通信協議分層思想
為什么要分層:
由于結點之間聯系很復雜,在制定協議時,把復雜成份分解成一些簡單的成份,再將它們復合起來。最常用的復合方式就是層次方式,及同層間可以通信,上一層可以調用下一層,而與再下一層不發生關系。各層互不影響,利于系統的開發和擴展。
通信協議的分層規定:
把用戶應用程序作為最高層,把物理通信線路作為最底層,將其間的協議處理分為若干層,規定每層處理的任務,也規定每層的接口標準。
四、參考模型
五、IP協議
??? 每個人的電腦都有一個獨一無二的IP地址,這樣互相通信時就不會傳錯信息了。
??? IP地址是用一個點來分成四段的,在計算機內部IP地址是用四個字節來表示的,一個字節代表一段,每一個字節代表的數最大只能到達255。
InetAddress類
說到IP地址,就要引入一個類:InetAddress
此類表示互聯網協議 (IP) 地址。
InetAddress類無構造方法
常用方法摘要
byte[] getAddress()
返回此 InetAddress 對象的原始 IP 地址。
static InetAddress getByName(String host)
在給定主機名的情況下確定主機的 IP 地址。
String getHostAddress()
返回 IP 地址字符串(以文本表現形式)。
String getHostName()
獲取此 IP 地址的主機名。
static InetAddress getLocalHost()
返回本地主機。
127.0.0.1:本機地址,主要用于測試。別名:Localhost
案例
import java.net.InetAddress; import java.net.UnknownHostException;public class TestIP {public static void main(String[] args) throws UnknownHostException {//InetAdress類表示IP地址//獲取本機IPInetAddress ip = InetAddress.getLocalHost();System.out.println(ip);//獲得主機名System.out.println(ip.getHostName());//獲得IP地址System.out.println(ip.getHostAddress());} }案例二
import java.net.InetAddress; import java.net.UnknownHostException;public class TestIP2 {public static void main(String[] args) throws UnknownHostException {InetAddress inetAddress = InetAddress.getByName("www.baidu.com");// 獲取此 IP 地址的主機名。System.out.println(inetAddress.getHostName());//返回 IP 地址字符串(以文本表現形式)。System.out.println(inetAddress.getHostAddress());} }運行
在這里插入圖片描述
六、端口
??? IP地址用來標識一臺計算機,但是一臺計算機上可能提供多種網絡應用程序,如何來區分這些不同的程序呢?這就要用到端口。
??? 端口是虛擬的概念,并不是說在主機上真的有若干個端口。
??? 通過端口,可以在一個主機上運行多個網絡應用程序。端口的表示是一個16位的二進制整數,2個字節,對應十進制的0~65535。
MySQL(3306),Oracle(1521),Tomcat(8080)等等程序都有自己的端口
查看端口
??? 用命令提示符cmd查看所有端口:netstat -ano
??? 查看具體程序:使用任務管理器查看PID
InetSocketAddress類
說到端口,則要引入一個類:InetSocketAddress
此類實現 IP 套接字地址(IP 地址 + 端口號)。
構造方法摘要
InetSocketAddress(InetAddress addr, int port)
根據 IP 地址和端口號創建套接字地址。
InetSocketAddress(int port)
創建套接字地址,其中 IP 地址為通配符地址,端口號為指定值。
InetSocketAddress(String hostname, int port)
根據主機名和端口號創建套接字地址。
常用方法摘要
InetAddress getAddress()
獲取 InetAddress。
String getHostName()
獲取 hostname。
int getPort()
獲取端口號。
案例
import java.net.InetAddress; import java.net.InetSocketAddress;public class TestPort {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8082);System.out.println(inetSocketAddress.getHostName());//獲得InetSocketAddress的端口System.out.println(inetSocketAddress.getPort());System.out.println(inetSocketAddress.getHostString());//返回一個InetAddress對象(IP對象)InetAddress address = inetSocketAddress.getAddress();} }七、URL
URI=URL+URN
URI:Uniform Resource Identifier ,統一資源標志符。
URL:Uniform Resource Locator,統一資源定位符。
URN:Uniform Resource Name,統一資源命名。
網絡三大基石:HTML,HTTP,URL
URL
??? 在www上,每一信息資源都有統一且唯一的地址,即統一資源定位符。Uniform Resource Locator。
??? 如:https://localhost:8080/index.html ,有4部分組成。(協議,主機域名或IP,端口號,資源文件名)
URL類
構造方法摘要
URL(String spec)
根據 String 表示形式創建 URL 對象。
URL(String protocol, String host, int port, String file)
根據指定 protocol、host、port 號和 file 創建 URL 對象。
URL(String protocol, String host, String file)
根據指定的 protocol 名稱、host 名稱和 file 名稱創建 URL。
常用方法摘要
String getAuthority()
獲取此 URL 的授權部分。
int getDefaultPort()
獲取與此 URL 關聯協議的默認端口號。
String getFile()
獲取此 URL 的文件名。
String getHost()
獲取此 URL 的主機名(如果適用)。
String getPath()
獲取此 URL 的路徑部分。
int getPort()
獲取此 URL 的端口號。
String getUserInfo()
獲取此 URL 的 userInfo 部分。
案例
import java.net.MalformedURLException; import java.net.URL;public class TestURL {public static void main(String[] args) throws MalformedURLException {URL url2 = new URL("https://www.bilibili.com/");//獲取此的授權部分 URL 。System.out.println(url2.getAuthority());//獲取此 URL的文件名。System.out.println(url2.getFile());//獲取端口System.out.println(url2.getPort());//獲取主機System.out.println(url2.getHost());//獲得默認端口System.out.println(url2.getDefaultPort());//獲得路徑System.out.println(url2.getPath());//獲取該 URL的userInfo部分。System.out.println(url2.getUserInfo());} }小結:
八、TCP協議和UDP協議
??? TCP和UDP位于同一層,都是建立在IP層的基礎之上。由于兩臺電腦之間有不同的IP地址,因此兩臺電腦就可以區分開來,也就可以互相通話了。
??? 通話一般有兩種通話方式:第一種是TCP,第二種是UDP。
??? TCP是可靠的連接,TCP就像打電話,需要先打通對方電話,等待對方有回應后才會跟對方繼續說話,也就是一定要確認可以發信息以后才會把信息發出去。TCP上傳任何東西都是可靠的,只要兩臺機器上建立起了連接,在本機上發送的數據就一定能傳到對方的機器上。
??? UDP就好比發電報,發出去就完事了,對方有沒有接收到它都不管,所以UDP是不可靠的。
??? TCP傳送數據雖然可靠,但傳送得比較慢;UDP傳送數據不可靠,但是傳送得快。
UDP編程:
需求:完成在線咨詢功能,學生和老師在線一對一交流
分析:
??? 使用基于UDP協議的Socket網絡編程實現
??? 不需要利用IO流實現數據的傳輸
??? 每個數據發送單元被統一封裝成數據包的方式,發送方將數據包發送到網絡中,數據包在網絡中去尋找他的目的地,一切以包為中心。
UDP基本概念:
??? DatagramSocket:用于發送或接收數據包的套接字
??? DatagramPacket:數據包
實現
接收方
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;public class PeopleOne {public static void main(String[] args) throws IOException {//1.開放一個端口DatagramSocket socket = new DatagramSocket(5051);//2.準備容器接收byte[] receiveBuf = new byte[100];//3.等待包裹容器封包DatagramPacket packet = new DatagramPacket(receiveBuf,receiveBuf.length);System.out.println("等你包裹來。。。。");while (true){//4.接收包裹socket.receive(packet);//5.解析包裹String receStr = new String(packet.getData(),0,packet.getLength());System.out.println("我收到了:"+receStr);if (receStr.equals("exit")){break;}}//6.釋放資源socket.close();} }?
發送方
import java.io.IOException; import java.net.*; import java.util.Scanner;public class PeopleTwo {public static void main(String[] args) throws IOException {//1.指定一個端口進行發送DatagramSocket socket = new DatagramSocket();//2.指定一個IPInetAddress addr = InetAddress.getByName("127.0.0.1");int port = 5051;//3.準備一個小容器byte[] sendBuf;while (true){Scanner scanner = new Scanner(System.in);System.out.println("你要發什么東西:");String s = scanner.nextLine();//4.加入要放的數據sendBuf = s.getBytes();//5.數據打包DatagramPacket packet = new DatagramPacket(sendBuf,sendBuf.length,addr,port);//6.發送包socket.send(packet);if (s.equals("exit")){break;}}//7.釋放資源socket.close();} }運行
在這里插入圖片描述
在這里插入圖片描述
TCP編程:
需求:完成網絡登錄功能
??? 用戶輸入用戶名密碼,服務器給出登錄成功或失敗的提示
分析:
??? 使用基于TCP協議的Socket網絡編程實現
??? TCP協議基于請求響應模式
??? 在網絡通訊中,第一次主動發起通訊的程序被作為客戶端程序
??? 第一次通訊中等待連接的程序被稱作服務器程序
??? 利用IO流實現數據的傳輸
實現
服務器
import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class TestServer {public static void main(String[] args) throws IOException {//服務器開啟了一個監聽端口ServerSocket serverSocket = new ServerSocket(6666);System.out.println("開啟了服務器");while (true){//等待客戶端連接Socket accept = serverSocket.accept();System.out.println("有一個人連接過來了");//獲得客戶端輸入的東西InputStream inputStream = accept.getInputStream();//包裝成DataInputStream流DataInputStream dataInputStream = new DataInputStream(inputStream);//通過流流讀取消息String s = dataInputStream.readUTF();System.out.println(s);}} }客戶端
import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket;public class TestClient {public static void main(String[] args) throws IOException {//創建同一連接Socket s = new Socket("127.0.0.1",6666);DataOutputStream dos = new DataOutputStream(s.getOutputStream());dos.writeUTF("hello,world!");} }運行
在這里插入圖片描述
九、Socket編程
一般的網絡編程都稱為Socket編程,Socket的英文意思是“插座”。
在這里插入圖片描述
??? 兩臺電腦都安裝上一個插座,然后使用一根線的兩端插到兩臺電腦的插座上,這樣兩臺電腦就建立好了連接。這個插座就是Socket。
??? 因為互相之間都能互相通信,我說你是我的Server只是從邏輯意義上來講,我應該把東西先發到你那里去,然后由你來處理,轉發。所以你叫Server。但從技術意義上來講,只有TCP才會分Server和Client。對于UDP來說,從嚴格意義上來講,并沒有所謂的Server和Client。TCP的Server的插座就叫ServerSocket,Client的插座就叫Socket。
??? 兩臺計算機互相連接,那么首先必須得知道它們的IP地址,但是只提供IP地址是不夠的,還必須要有連接的端口號,也就是要連接到哪個應用程序上。
??? 端口號是用來區分一臺機器上不同的應用程序的。端口號在計算機內部是占2個字節。一臺機器上最多有65536個端口號。一個應用程序可以占用多個端口號。端口號如果被一個應用程序占用了,那么其他的應用程序就無法再使用這個端口號了。記住一點,我們編寫的程序要占用端口號的話占用1024以上的端口號,1024以下的端口號不要去占用,因為系統有可能會隨時征用。端口號本身又分為TCP端口和UDP端口,TCP的8888端口和UDP的8888端口是完全不同的兩個端口。TCP端口和UDP端口都有65536個。
好像沒啥評論,答案A,D,留給思考的你們。
我是歌謠,今天刷題結束。不斷積累,不斷學習,共同交流,不多說了,代碼走起來。
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期科技領域知識)
歌謠帶你看java面試題
總結
以上是生活随笔為你收集整理的java面试题32:Java网络程序设计中,下列正确的描述是()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ux设计_声音建议:设计UX声音的快速指
- 下一篇: Ubuntu下常用软件介绍