socket技術要點總結

來源:才華庫 1.58W

socket技術要點總結

socket技術要點總結

篇一:socket技術總結

Socket技術要點總結

1、什麼是TCP/IP、UDP,它的結構是什麼?

1.1 TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是為廣域網(WANs)設計的。 TCP 是傳輸控制協議,是一個面向連線的協議,為使用者程序提供可靠的全雙工位元組流。TCP 套接字是一種流套接字(stream socket)關心確認,超時和重傳之類的細節。大多數網路應用程式都在使用TCP。

注意:TCp既可以使用IPv4,也可以使用IPv6.

1.2UDP(User Data Protocol,使用者資料報協議)是與TCP相對應的協議。它是屬於TCP/IP協議族中的一種。

UDP是一個無連線協議,UDP套接字是一種資料報套接字(datagram socket)。UDP資料報不能保證最終到達它們的目的地。和TCP一樣,UDP既可以使用IPv4,也可以使用ipv6.

1.3 TCP和UDP的區別?可靠性

在TCP/IP協議中,TCP協議通過三次握手建立一個可靠的連線(像打電話) 第一次握手:客戶端嘗試連線伺服器,向伺服器傳送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待伺服器確認

第二次握手:伺服器接收客戶端syn包並確認(ack=j+1),同時向客戶端傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態

第三次握手:第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手

定睛一看,伺服器socket與客戶端socket建立連線的部分其實就是大名鼎鼎的三次握手

而UDP是不可靠的連線,像是寫信,對方不一定能夠收到信的內容;

1.4 TCP/IP、UDP的分層:

由上可以看到TCP/IP協議族包括應用層、運輸層、網路層、鏈路層。

et

2.1 套接字(socket)概念 套接字(socket)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元

應用層通過傳輸層進行資料通訊時,TCP會遇到同時為多個應用程式程序提供併發服務的問題。多個TCP連線或多個應用程式程序可能需要通過同一個 TCP協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面。應用層可以和傳輸層通過Socket介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。

2.2 建立socket連線

建立Socket連線至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於伺服器端,稱為ServerSocket。

套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。 伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。

客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。

連線確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連線。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

服務端: ServerSocket serverSocket = new ServerSocket(PORT);

Socket client = pt();

客戶端:Socketsocket = new Socket(IP_ADDR, PORT);

nputStream()、nputStream()獲取到流傳遞資料資訊; 補充:

HTTP連線

HTTP協議即超文字傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。 HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。

1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連線,在處理完本次請求後,就自動釋放連線。

2)在HTTP 1.1中則可以在一次連線中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。

由於HTTP在每次請求結束後都會主動釋放連線,因此HTTP連線是一種“短連線”,要保持客戶端程式的線上狀態,需要不斷地向伺服器發起連線請求。通常的做法是即使不需要獲得任何資料,客戶端也保持每隔一段固定的時間向伺服器

篇二:Socket初步總結文件

Socket

說明

所謂socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的句

柄。應用程式通常通過"套接字"向網路發出請求或者應答網路請求。

以J2SDK-1.3為例,Socket和ServerSocket類庫位於包中。

ServerSocket用於伺服器端,Socket是建立網路連線時使用的。在連線成功時,應用程式兩端都會產生一個Socket例項,操作這個例項,完成所需的會話。對於一個網路連線來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。

重要的Socket API:

et繼承於ct,有八個構造器,其方法並不多,下

面介紹使用最頻繁的三個方法,其它方法大家可以見JDK-1.3文件。

. Accept方法用於產生"阻塞",直到接受到一個連線,並且返回一個客戶端的

Socket物件例項。"阻塞"是一個術語,它使程式執行暫時"停留"在這個地方,直到一個會話產生,然後程式繼續;通常"阻塞"是由迴圈產生的。

. getInputStream方法獲得網路連線輸入,同時返回一個InputStream物件例項

. getOutputStream方法連線的另一端將得到輸入,同時返回一個OutputStream物件例項。

注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流物件,通常都會被另一個流物件使用。

通訊方式

主要有以下三大類:

(一)SERVER/CLIENT方式

1.一個Client方連線一個Server方,或稱點對點(peer to peer)=892

2 .多個Client方連線一個Server方,這也是通常的併發伺服器方式。

3.一個Client方連線多個Server方,這種方式很少見,主要用於一個客戶向多個服務 器傳送請求情況。

(二)連線方式

1.長連線

Client方與Server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。這種方式下由於通訊連線一直存在,可以用下面命令檢視連線是否建立:

netstat –f inet|grep 埠號(如5678)。此種方式常用於點對點通訊。

2.短連線

Client方與Server每進行一次報文收發交易時才進行通訊連線,交易完畢後立即斷開連線。此種方式常用於一點對多點通訊,比如多個Client連線一個Server.

(三)傳送接收方式

1.非同步

報文傳送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:

(1)非同步雙工:接收和傳送在同一個程式中,有兩個不同的子程序分別負責傳送和接收

(2)非同步單工:接收和傳送是用兩個不同的程式來完成。

2.同步

報文傳送和接收是同步進行,既報文傳送後等待接收返回報文。同步方式一般需要考慮超時問題,即報文發上去後不能無限等待,需要設定超時時間,超過該時間傳送方不再等待讀返回報文,直接通知超時返回。

實際通訊方式是這三類通訊方式的組合。比如一般書上提供的TCP/IP範例程式大都是同步短連線的SERVER/CLIENT程式。有的組合是基本不用的,比較常用的有價值的組合是以下幾種:

同步短連線Server/Client

同步長連線Server/Client

非同步短連線Server/Client

非同步長連線雙工Server/Client

非同步長連線單工Server/Client

其中非同步長連線雙工是最為複雜的一種通訊方式,有時候經常會出現在不同銀行或不同城市之間的兩套系統之間的通訊。比如金卡工程。由於這幾種通訊方式比較固定,所以可以預先編制這幾種通訊方式的模板程式。

報文格式

通訊報文格式多樣性更多,相應地就必須設計對應的讀寫報文的接收和傳送報文函式。

(一)阻塞與非阻塞方式

1.非阻塞方式

讀函式不停地進行讀動作,如果沒有報文接收到,等待一段時間後超時返回,這種情況一般需要指定超時時間。

2.阻塞方式

如果沒有報文接收到,則讀函式一直處於等待狀態,直到有報文到達。

(二)迴圈讀寫方式

1.一次直接讀寫報文

在一次接收或傳送報文動作中一次性不加分別地全部讀取或全部發送報文位元組。

2.不指定長度迴圈讀寫

這一般發生在短連線程序中,受網路路由等限制,一次較長的報文可能在網路傳輸過程中被分解成了好幾個包。一次讀取可能不能全部讀完一次報文,這就需要迴圈讀報文,直到讀完為止。

3.帶長度報文頭迴圈讀寫

這種情況一般是在長連線程序中,由於在長連線中沒有條件能夠判斷迴圈讀寫什麼時候結束,所以必須要加長度報文頭。讀函式先是讀取報文頭的長度,再根據這個長度去讀報文.實際情況中,報頭的碼制格式還經常不一樣,如果是非ASCII碼的報文頭,還必須 轉換成ASCII,常見的報文頭碼制有:

(1)n個位元組的ASCII碼

(2)n個位元組的BCD碼

(3)n個位元組的網路整型碼

Socket通訊模型

ServerSocket類例子

int PORT = 8888; // 偵聽埠

// 建立ServerSocket

ServerSocket serverSocket = new ServerSocket(PORT);// 開始迴圈

while (true) {

// 等待連線

Socket socket = pt();

// 處理連結的執行緒類

ServerThread st = new ServerThread(socket);

// 啟動執行緒處理

new Thread(st)t();

}

客戶端的例子

int PORT = 8888; // 偵聽埠

// 建立連線

socket = new Socket(“”, 8888);

// 輸入資料的讀取

BufferedReader

netIn=newBufferedReader(new

InputStreamReader(nputStream()));

// 寫入資料

PrintWriter netOut = new PrintWriter(utputStream());

篇三:socket程式設計實驗心得體會

實驗心得體會

在本次實驗中,我通過對網路課上所學知識的應用,學到了很多實踐中的知識。並且加深了我對課本知識的理解和認識,在實驗過程中,更容易記憶和深入理解各種協議的工作以及在網路程式設計中應該注意的一系列問題。

我們的第一個實驗是對ARP、ICMP、FTP和HTTP協議的分析和驗證。在利用軟體Etherpeek抓取在主機通訊中的報文,得到了很多的關於這些協議的具體引數。在課程學習過程中,書本和老師給我的感覺就是太枯燥,通過課本的學習根本沒有辦法理解各種協議的工作細節。有很多的細微之處是想不通的。但是,在本次實驗中,我就通過各種報文的分析,看到了網路中不同層次協議之間的協做過程。對應不同層之間就是通過協議來使用,我對整個網路的大體架構有了一個統籌的瞭解,雖然對很多的更深入的`知識不是很瞭解,但是比我在課上學的東西要更有趣,而且容易學習,更能夠我學習的興趣。 第二個實驗是Socket程式設計實驗。在編寫網路程式之前,我對網路通訊可以說一無所知,根本不知道那些網路上的程式是怎麼通過網路進行通訊的。在本次實驗中,終於揭開了他們神祕的面紗。當然在實驗中出現了很多的插曲,我是在Linux環境下編寫的程式,很多技術方面的問題都無法解決。查閱書籍和網上諮詢才弄懂了他們的來龍去脈,最終是將我的程式編寫完了。開始接觸網路程式設計時,那是一頭霧水,根本不知從何下手。在看了輔導教員給我們程式之後才有了很多的起色,才能夠自己編寫程式。在網路程式設計中,我最深的體會就是對具體的內部細節不熟悉,導致在除錯的過程中感覺到很無力。在很多函式的作用下,經常就是一團亂麻。之後,我每次編寫之前就是將用到的函式的用法溫習一下,最後還是能夠解決很多的問題的。

本次試驗是我們學習網路的第一次。以前的課程從來沒有接觸到網路方面的知識。這次的新知識對我們的挑戰還算不是太大,通過我們的努力,所有的困難時被克服掉了。其實,實驗應該是我們的重點,在以後的工作中要的就是我們的實際的動手能力,如果我們在學習期間就是隻學了書本上的知識,那樣對理論的瞭解是不夠深刻的,只有通過實驗才能激發我們的學習興趣。總之,我覺得實驗才是檢驗理論的唯一標準。

熱門標籤