一:網路編程基礎知識 網路編程基礎知識: IP地址與連接埠號碼
網路中的電腦若需要實現相互連訊,必須為每台電腦指定標示號,通過標識號來指定接受資料和識別發送資料的電腦。TCP/IP協議中的“標示”即為IP地址。
一台電腦課同時運行多個網路程式,使用IP地址能夠將資料發送到電腦,卻不能夠保證將資料提交至哪個網路程式。因此每個被發送的網路資料包的頭部都設有"連接埠"部分,該部分為整數,用於表示將資料幀交給哪個應用程式去處理。同時必須為網路程式指定連接埠號碼,使不同的應用程式接受不同連接埠上的資料。同一台電腦不能存在多個使用同一連接埠的程式。
連接埠數的範圍在0~65535之間,其中在0~1023之間的連接埠號碼用於知名的網路服務和應用,1024以上的連接埠號碼用於普通網路應用程式,這樣做可以避免連接埠號碼代表網路程式串用。如某網路程式指定連接埠號碼為3900時,則其他網路程式發送的資料包中必須指明接收程式的連接埠號碼為3900,資料達到後電腦將根據資料包中的連接埠號碼進行接收。 TCP與UDP
TCP為傳輸控制通訊協定,uDP為使用者資料包通訊協定。
tcp是連線導向的銅須協議,他提供兩台電腦之間可靠無差的資料轉送。應用程式使用tcp通訊時,資料來源與目標之間將建立虛擬串連,串連一但建立,兩台電腦之間就可以將資料作為雙向位元組流進行互動。TCP操作模式類似於打電話,只有確認對方接通後,才開始通話,且雙方均能夠聽到對方的講話內容。
udp是不需連線的通訊協議,他不保證可靠資料的傳輸,但能夠實現向若干個目標發送資料的功能。例如當a主機向b主機發送資料時,資料將立即發出,無論主機b是否已準備接收。主機b的資料接收機制與主機a的發送機制類似,無論資料收到與否,它不再向主機a確認。upd操作模式類似於傳呼台向使用者發送資訊,傳呼台本身對使用者能否收到訊息不可控,使用者也不會向傳呼台反饋是否收到訊息。 socket簡介
socket(通訊端)是網路驅動層為應用程式提供介面和機制,其作用可以看做是為應用程式建立的港口碼頭。應用程式的任務是將裝載貨物的集裝箱(程式中通過網路發送的資料)放在港口碼頭上,剩餘工作交給貨運公司(驅動程式)去處理。接收資料時,應用程式同樣需要建立港口碼頭,貨物(資料)到達後,應用程式從碼頭(Socket)取走貨物即可。
雙向鏈路的一端稱為一個socket 二:TCP網路編程 TCP網路概述
使用tcp協議編寫網路程式,需要提供伺服器端程式和用戶端程式。伺服器端與用戶端程式的操作過程類似於114查號台與普通電話之間的關係,運行時必須先有114查號台(伺服器端程式),普通電話(用戶端程式)才能撥打、查號。在114查號台(伺服器端程式)有一個總機專門接聽撥打進來的電話,但總機並不直接實行對話,而是將電話分配到閒置分機進行處理。當沒有空閑分機時,提示客戶坐席忙、需要排隊等候,當等候服務的電話到達一定數量時,總機將徹底拒絕新撥打進來的電話。Java中的ServerSocket類似於114查號台總機。
tcp協議具體操作步驟如下:
(1)伺服器程式建立serversocket對象,調用accept()方法等待用戶端串連。
(2)用戶端程式建立socket對象並請求與伺服器建立串連。
(3)伺服器接收客戶的串連請求,並建立新的socket對象與用戶端建立串連專線。
(4)實現(2),(3)步驟中建立串連的兩個Socket在同一線程上對話。
(5)伺服器重新等待新的串連請求。 serverSocket類
tcp網路伺服器程式的編寫,需要使用serversocket類建立伺服器。ServerSocket類的主要方法:
servlersocket類主要方法
| public ServerSocket(int prot) |
構造方法 |
建立ServerSocket執行個體 |
| public Socket accept() |
方法 |
等待用戶端串連 |
| public InetAddress GetInetAddress() |
方法 |
返回伺服器的ip地址 |
| public boolean isClosed() |
方法 |
返回ServerSocket的關閉狀態 |
| public void close() |
方法 |
關閉ServerSocket |
伺服器端每次運行時均需要調用accept()方法等待用戶端串連,該方法執行後服務端將進入阻塞狀態,知道用戶端再次串連。accept()方法的傳回型別為Socket。 Socket類
用戶端必須建立Socket對象來建立與伺服器的串連,每個Socket對象代表一個用戶端。
Socket類的常用方法
| 方法 |
類型 |
描述 |
| public Socket(String host,int prot) |
構造方法 |
構造Socket對象,同時指定要串連伺服器的主機名稱和連接埠號碼 |
| public InputStream getInputStream() |
方法 |
返回通訊端的輸入資料流 |
| public OutputStream getOutPutStream() |
方法 |
返回通訊端的輸出資料流 |
| public boolean isClosed() |
方法 |
判斷通訊端是否關閉 |
| public void close() |
方法 |
關閉此Socket |
ServerSocket與Socket的關係如圖
tcp網路編程中的資訊使用輸入輸出資料流的形式傳遞。