java編程筆記
只能看到交互的雙方及交互協(xié)議 個人認為可以看做人與人之間按照約定方式進行交流
HTTP協(xié)議:超文本傳輸協(xié)議(用于實現(xiàn)Web文檔的請求和轉(zhuǎn)發(fā))
SMTP協(xié)議:簡單電子郵件傳輸協(xié)議
FTP協(xié)議:文件傳輸協(xié)議
Telnet協(xié)議:網(wǎng)絡(luò)遠程訪問協(xié)議
傳輸層:提供客戶端和服務(wù)器之間傳輸應(yīng)用層報文的服務(wù) 對等體:段或用戶數(shù)據(jù)報 次高抽象層,為交互雙方提供信息傳輸服務(wù) 個人認為可以看做為人與人之間交流提供途徑,如“寫信”
TCP:面向連接的服務(wù) 管生又管養(yǎng)
UDP:無連接服務(wù) 管生不管養(yǎng)
網(wǎng)絡(luò)層:按照運輸層協(xié)議,提供主機之間傳遞數(shù)據(jù)報的服務(wù) 對等體:數(shù)據(jù)包 個人認為可以看做實現(xiàn)了信件在省份之間的收發(fā)服務(wù)
數(shù)據(jù)鏈路層 對等體:幀 個人認為可以看做實現(xiàn)了信件在城市之間的收發(fā)服務(wù)
物理層 對等體:位 個人認為可以看做實現(xiàn)了信件在具體郵局之間的收發(fā)服務(wù)
TCP/IP的一些基本概念
IP地址:連接到TCP/IP網(wǎng)絡(luò)上的每臺設(shè)備的唯一地址標識
端口(Port):每臺設(shè)備中每個應(yīng)用程序的唯一標識
套接字(Socket):通信端點,由IP地址+端口號組成
傳輸控制協(xié)議(TCP)
面向連接的保證可靠傳輸?shù)膮f(xié)議
收發(fā)雙方的一對socket建立連接后進行雙向數(shù)據(jù)傳輸、
用戶數(shù)據(jù)報協(xié)議(UDP)
無連接傳輸協(xié)議,無序,不一定安全,但簡單效率高
將要傳輸目的地定義成數(shù)據(jù)報(Datagram) 在數(shù)據(jù)報中指明要到達的端點(Socket) 發(fā)送數(shù)據(jù)報
域名
服務(wù)器地址的別名
Java網(wǎng)絡(luò)編程
通過流模式實現(xiàn)網(wǎng)絡(luò)交互,一個接口同時擁有輸入流和輸出流 一個進程向端口輸出流寫數(shù)據(jù),另一個進程在接口的輸入流上讀數(shù)據(jù)即可
Java提供的網(wǎng)絡(luò)編程類
簡記方法:
帶URL的為面向應(yīng)用層的類
帶Socket的為面向運輸層中TCP協(xié)議相關(guān)的類
帶Datagram的為面向運輸層中UDP協(xié)議相關(guān)的類
帶Exception的為各種異常
領(lǐng)域類名面向應(yīng)用層的類URL URLConnection面向運輸層中與TCP協(xié)議相關(guān)的類Socket ServerSocket面向運輸層中與UDP協(xié)議相關(guān)的類DatagramPakcet DatagramSocket MulticastSocket指向網(wǎng)絡(luò)層的類InetAddress可能產(chǎn)生的異常BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException
InetAddress的使用
Java的IP地址封裝類
無構(gòu)造函數(shù),直接用靜態(tài)方法獲取InetAddress實例
public static InetAddress getByName(String host);
public static InetAddress getLocalHost();
public static InetAddress[] getAllByName(String host);
//host可以是機器名、IP地址或DSN域名
//潛在異常:UnknownHostException
InetAddress的主要方法
public byte[] getAddress()
//獲取本對象的IP地址并存放在字節(jié)數(shù)組中
public String getHostAddress()
//獲取本對象的IP地址“%d.%d.%d.%d”
public String getHostName()
//獲取本對象的機器名
統(tǒng)一資源定位器(URL)
Internet上資源地址的統(tǒng)一表達格式
語法格式:<protocol>:// <host : port>/dir/filename <要獲取資源的傳輸協(xié)議> :// <主機:端口號>/目錄/文件名
//URL構(gòu)造方法
public URL (String spec);
//spec:URL地址
public URL (URL context String spec);
//context:現(xiàn)有URL對象
//基于一個URL對象訪問同一主機上不同路徑的文件
public URL (String protocol,String host,String file);
public URL (String protocol,String host,int port,String file)
//協(xié)議、機器名稱、端口號、文件名//URL常用方法
public String getProtocol;//獲取URL協(xié)議名
public String getHost;//獲取URL主機名
public int getPort;//獲取URL端口號
public String getFile;//獲取URL文件名
public String getRef;//獲取URL相對位置
public String getPath;//獲取URL的路徑
public String getAuthority;//獲取URL的權(quán)限信息
public String getUserInfo;//獲取使用者信息
讀入URL數(shù)據(jù)
openStream():讀取一個URL對象指定的資源 與指定URL建立連接并返回一個InputStream對象
Socket接口
分為服務(wù)器端(ServerSocket)和客戶端(Socket)
通信步驟
服務(wù)器端生成ServerSocket對象,用accept()等待客戶端的連接請求
客戶端生成Socket對象并發(fā)出連接請求
服務(wù)器端通過accept()方法接收到客戶端的請求后,開辟連接用的接口,并生成所需I/O數(shù)據(jù)流
服務(wù)器端和客戶端通過由客戶端提供的Socket中的InputStream和OutputStream進行通信
通信結(jié)束后,服務(wù)器端關(guān)閉通過accept()得到的Socket接口,客戶端也要關(guān)閉Socket接口
客戶端Socket類
//Socket構(gòu)造方法
public Socket(String address,int port);
public Socket(InetAddress address,int port)
public Socket(String host,int port,InetAddress localAddress,int localPort);
public Socket(InetAddress address,int port,InetAddress localAddress,int localPort);
Socket類主要方法
方法名功能void close()關(guān)閉Socket連接InetAddress getInetAddress()獲取當(dāng)前連接的遠程主機的Internet地址InetAddress getLocalAddress()獲取本地主機的Internet地址InputStream getInputStream()獲取Socket輸入流OutputStream getOutputStream()獲取Socket輸出流int getPort()獲取當(dāng)前連接的遠程主機的端口號int getLocalPort()獲取本地主機的端口號void shutdownInput()關(guān)閉輸入流void shutdownOutput()關(guān)閉輸出流
服務(wù)器ServerSocket類
ServerSocket類用于監(jiān)聽來自指定端口的連接
在為新的連接創(chuàng)建一個Socket對象以后,客戶端便可與服務(wù)器端進行通信
//ServerSocket類構(gòu)造方法
public ServerSocket(int port);
public ServerSocket(int port,int backlog);
public ServerSocket(int port,int backlog,InetAddress bindAddress);
//port:端口號
//backlog:服務(wù)器忙時保持連接請求的等待客戶量
//bindAddress:指定的服務(wù)器IP地址
ServerSocket類主要方法
方法名功能Socket accept()接收該連接并返回該連接的Socket對象void close()關(guān)閉此服務(wù)器的SocketInetAddress getInetAddress()獲取服務(wù)器Socket綁定的地址int getLocalPort()獲取服務(wù)器Socket所偵聽的端口號int getSoTimeout()獲取連接的超時數(shù)void setSoTimeout(int timeout)設(shè)置ServerSocket的accept()方法等待用戶連接的超時時間 timeout默認為0,表示永遠不超時,直接進入阻塞狀態(tài)
?
?異常的處理方式:拋出異常后,首先使用new在堆上創(chuàng)建異常對象。然后,當(dāng)前的執(zhí)行路徑被終止,從當(dāng)前環(huán)境跳到對異常對象的引用。尋找下一個恰當(dāng)?shù)奈恢茫ó惓L幚沓绦颍├^續(xù)執(zhí)行,它的任務(wù)是從錯誤狀態(tài)種恢復(fù),以使程序能要么換一種方式運行,要么繼續(xù)運行下去。
異常拋出:
throw:使用它來拋出異常,可以把它類比return操作符(注意是類比,因為異常的處理位置可能會跨越方法調(diào)用棧的許多層級,而不是簡單的跳出該方法),它能拋出異常,并且跳出當(dāng)前作用域。它能拋出任意類型的Throwable對象(通常異常的唯一信息來自于它的名字)。
異常捕獲:
異常拋出了就得處理嘛,有兩種方式:
try-catch-finally語句(只有在你知道如何處理的情況下才捕獲異常。):
catch語句只有匹配的異常類型才會執(zhí)行,try-catch是 必須的結(jié)構(gòu)。
而finally語句一般在需要手動釋放資源時是必須的,它總會被執(zhí)行(無論break、continue還是return一樣會執(zhí)行)。所以注意不要因為使用了finally而跳過了某些異常,比如finally中拋出異常,或者直接return跳出當(dāng)前層次。
throws:聲明異常,誰調(diào)用誰處理。
終止與恢復(fù):
·.終止:在這種模型中,將假設(shè)錯誤非常嚴重,以至于程序無法返回到異常發(fā)生的地方繼續(xù)執(zhí)行。一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續(xù)執(zhí)行。
·.恢復(fù):在這種模型中,將假設(shè)錯誤非常嚴重,以至于程序無法返回到異常發(fā)生的地方繼續(xù)執(zhí)行。一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續(xù)執(zhí)行。(可以不用拋出異常,調(diào)用方法來修正該錯誤,或者把try塊放在while循環(huán),這樣就不斷地進入 try 塊,直到得到滿意的結(jié)果)
自定義異常類型:繼承Exception就行了(如果想要寫入System.err 而將錯誤發(fā)送給標準錯誤流,可以寫一個String 的構(gòu)造器,并賦值給父類)。注意命名規(guī)范。