socket技術(shù)要點(diǎn)總結
socket技術(shù)要點(diǎn)總結
篇一:socket技術(shù)總結
Socket技術(shù)要點(diǎn)總結
1、什么是TCP/IP、UDP,它的結構是什么?
1.1 TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個(gè)工業(yè)標準的協(xié)議集,它是為廣域網(wǎng)(WANs)設計的。 TCP 是傳輸控制協(xié)議,是一個(gè)面向連接的協(xié)議,為用戶(hù)進(jìn)程提供可靠的全雙工字節流。TCP 套接字是一種流套接字(stream socket).TCP關(guān)心確認,超時(shí)和重傳之類(lèi)的細節。大多數網(wǎng)絡(luò )應用程序都在使用TCP。
注意:TCp既可以使用IPv4,也可以使用IPv6.
1.2UDP(User Data Protocol,用戶(hù)數據報協(xié)議)是與TCP相對應的協(xié)議。它是屬于TCP/IP協(xié)議族中的一種。
UDP是一個(gè)無(wú)連接協(xié)議,UDP套接字是一種數據報套接字(datagram socket)。UDP數據報不能保證最終到達它們的目的地。和TCP一樣,UDP既可以使用IPv4,也可以使用ipv6.
1.3 TCP和UDP的區別?可靠性
在TCP/IP協(xié)議中,TCP協(xié)議通過(guò)三次握手建立一個(gè)可靠的連接(像打電話(huà)) 第一次握手:客戶(hù)端嘗試連接服務(wù)器,向服務(wù)器發(fā)送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶(hù)端進(jìn)入SYN_SEND狀態(tài)等待服務(wù)器確認
第二次握手:服務(wù)器接收客戶(hù)端syn包并確認(ack=j+1),同時(shí)向客戶(hù)端發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)
第三次握手:第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手
定睛一看,服務(wù)器socket與客戶(hù)端socket建立連接的部分其實(shí)就是大名鼎鼎的三次握手
而UDP是不可靠的連接,像是寫(xiě)信,對方不一定能夠收到信的內容;
1.4 TCP/IP、UDP的分層:
由上可以看到TCP/IP協(xié)議族包括應用層、運輸層、網(wǎng)絡(luò )層、鏈路層。
2.socket
2.1 套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò )通信的基本操作單元。
應用層通過(guò)傳輸層進(jìn)行數據通信時(shí),TCP會(huì )遇到同時(shí)為多個(gè)應用程序進(jìn)程提供并發(fā)服務(wù)的問(wèn)題。多個(gè)TCP連接或多個(gè)應用程序進(jìn)程可能需要通過(guò)同一個(gè) TCP協(xié)議端口傳輸數據。為了區別不同的應用程序進(jìn)程和連接,許多計算機操作系統為應用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過(guò)Socket接口,區分來(lái)自不同應用程序進(jìn)程或網(wǎng)絡(luò )連接的通信,實(shí)現數據傳輸的并發(fā)服務(wù)。
2.2 建立socket連接
建立Socket連接至少需要一對套接字,其中一個(gè)運行于客戶(hù)端,稱(chēng)為ClientSocket,另一個(gè)運行于服務(wù)器端,稱(chēng)為ServerSocket。
套接字之間的連接過(guò)程分為三個(gè)步驟:服務(wù)器監聽(tīng),客戶(hù)端請求,連接確認。 服務(wù)器監聽(tīng):服務(wù)器端套接字并不定位具體的客戶(hù)端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監控網(wǎng)絡(luò )狀態(tài),等待客戶(hù)端的連接請求。
客戶(hù)端請求:指客戶(hù)端的套接字提出連接請求,要連接的目標是服務(wù)器端的套接字。為此,客戶(hù)端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。
連接確認:當服務(wù)器端套接字監聽(tīng)到或者說(shuō)接收到客戶(hù)端套接字的連接請求時(shí),就響應客戶(hù)端套接字的請求,建立一個(gè)新的線(xiàn)程,把服務(wù)器端套接字的描述發(fā)給客戶(hù)端,一旦客戶(hù)端確認了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續處于監聽(tīng)狀態(tài),繼續接收其他客戶(hù)端套接字的連接請求。
服務(wù)端: ServerSocket serverSocket = new ServerSocket(PORT);
Socket client = serverSocket.accept();
客戶(hù)端:Socketsocket = new Socket(IP_ADDR, PORT);
socket.getInputStream()、socket.getInputStream()獲取到流傳遞數據信息; 補充:
HTTP連接
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎,也是手機聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應用。 HTTP連接最顯著(zhù)的特點(diǎn)是客戶(hù)端發(fā)送的每次請求都需要服務(wù)器回送響應,在請求結束后,會(huì )主動(dòng)釋放連接。從建立連接到關(guān)閉連接的過(guò)程稱(chēng)為“一次連接”。
1)在HTTP 1.0中,客戶(hù)端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動(dòng)釋放連接。
2)在HTTP 1.1中則可以在一次連接中處理多個(gè)請求,并且多個(gè)請求可以重疊進(jìn)行,不需要等待一個(gè)請求結束后再發(fā)送下一個(gè)請求。
由于HTTP在每次請求結束后都會(huì )主動(dòng)釋放連接,因此HTTP連接是一種“短連接”,要保持客戶(hù)端程序的在線(xiàn)狀態(tài),需要不斷地向服務(wù)器發(fā)起連接請求。通常的做法是即使不需要獲得任何數據,客戶(hù)端也保持每隔一段固定的時(shí)間向服務(wù)器
篇二:Socket初步總結文檔
Socket
說(shuō)明
所謂socket通常也稱(chēng)作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句
柄。應用程序通常通過(guò)"套接字"向網(wǎng)絡(luò )發(fā)出請求或者應答網(wǎng)絡(luò )請求。
以J2SDK-1.3為例,Socket和ServerSocket類(lèi)庫位于java.net包中。
ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò )連接時(shí)使用的。在連接成功時(shí),應用程序兩端都會(huì )產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì )話(huà)。對于一個(gè)網(wǎng)絡(luò )連接來(lái)說(shuō),套接字是平等的,并沒(méi)有差別,不因為在服務(wù)器端或在客戶(hù)端而產(chǎn)生不同級別。不管是Socket還是ServerSocket它們的工作都是通過(guò)SocketImpl類(lèi)及其子類(lèi)完成的。
重要的Socket API:
java.net.Socket繼承于java.lang.Object,有八個(gè)構造器,其方法并不多,下
面介紹使用最頻繁的三個(gè)方法,其它方法大家可以見(jiàn)JDK-1.3文檔。
. Accept方法用于產(chǎn)生"阻塞",直到接受到一個(gè)連接,并且返回一個(gè)客戶(hù)端的
Socket對象實(shí)例。"阻塞"是一個(gè)術(shù)語(yǔ),它使程序運行暫時(shí)"停留"在這個(gè)地方,直到一個(gè)會(huì )話(huà)產(chǎn)生,然后程序繼續;通常"阻塞"是由循環(huán)產(chǎn)生的。
. getInputStream方法獲得網(wǎng)絡(luò )連接輸入,同時(shí)返回一個(gè)InputStream對象實(shí)例
. getOutputStream方法連接的另一端將得到輸入,同時(shí)返回一個(gè)OutputStream對象實(shí)例。
注意:其中g(shù)etInputStream和getOutputStream方法均會(huì )產(chǎn)生一個(gè)IOException,它必須被捕獲,因為它們返回的流對象,通常都會(huì )被另一個(gè)流對象使用。
通信方式
主要有以下三大類(lèi):
(一)SERVER/CLIENT方式
1.一個(gè)Client方連接一個(gè)Server方,或稱(chēng)點(diǎn)對點(diǎn)(peer to peer)=892
2 .多個(gè)Client方連接一個(gè)Server方,這也是通常的并發(fā)服務(wù)器方式。
3.一個(gè)Client方連接多個(gè)Server方,這種方式很少見(jiàn),主要用于一個(gè)客戶(hù)向多個(gè)服務(wù) 器發(fā)送請求情況。
(二)連接方式
1.長(cháng)連接
Client方與Server方先建立通訊連接,連接建立后不斷開(kāi),然后再進(jìn)行報文發(fā)送和接收。這種方式下由于通訊連接一直存在,可以用下面命令查看連接是否建立:
netstat –f inet|grep 端口號(如5678)。此種方式常用于點(diǎn)對點(diǎn)通訊。
2.短連接
Client方與Server每進(jìn)行一次報文收發(fā)交易時(shí)才進(jìn)行通訊連接,交易完畢后立即斷開(kāi)連接。此種方式常用于一點(diǎn)對多點(diǎn)通訊,比如多個(gè)Client連接一個(gè)Server.
(三)發(fā)送接收方式
1.異步
報文發(fā)送和接收是分開(kāi)的,相互獨立的,互不影響。這種方式又分兩種情況:
(1)異步雙工:接收和發(fā)送在同一個(gè)程序中,有兩個(gè)不同的子進(jìn)程分別負責發(fā)送和接收
(2)異步單工:接收和發(fā)送是用兩個(gè)不同的程序來(lái)完成。
2.同步
報文發(fā)送和接收是同步進(jìn)行,既報文發(fā)送后等待接收返回報文。同步方式一般需要考慮超時(shí)問(wèn)題,即報文發(fā)上去后不能無(wú)限等待,需要設定超時(shí)時(shí)間,超過(guò)該時(shí)間發(fā)送方不再等待讀返回報文,直接通知超時(shí)返回。
實(shí)際通信方式是這三類(lèi)通信方式的組合。比如一般書(shū)上提供的TCP/IP范例程序大都是同步短連接的SERVER/CLIENT程序。有的組合是基本不用的,比較常用的有價(jià)值的組合是以下幾種:
同步短連接Server/Client
同步長(cháng)連接Server/Client
異步短連接Server/Client
異步長(cháng)連接雙工Server/Client
異步長(cháng)連接單工Server/Client
其中異步長(cháng)連接雙工是最為復雜的一種通信方式,有時(shí)候經(jīng)常會(huì )出現在不同銀行或不同城市之間的兩套系統之間的通信。比如金卡工程。由于這幾種通信方式比較固定,所以可以預先編制這幾種通信方式的模板程序。
報文格式
通信報文格式多樣性更多,相應地就必須設計對應的讀寫(xiě)報文的接收和發(fā)送報文函數。
(一)阻塞與非阻塞方式
1.非阻塞方式
讀函數不停地進(jìn)行讀動(dòng)作,如果沒(méi)有報文接收到,等待一段時(shí)間后超時(shí)返回,這種情況一般需要指定超時(shí)時(shí)間。
2.阻塞方式
如果沒(méi)有報文接收到,則讀函數一直處于等待狀態(tài),直到有報文到達。
(二)循環(huán)讀寫(xiě)方式
1.一次直接讀寫(xiě)報文
在一次接收或發(fā)送報文動(dòng)作中一次性不加分別地全部讀取或全部發(fā)送報文字節。
2.不指定長(cháng)度循環(huán)讀寫(xiě)
這一般發(fā)生在短連接進(jìn)程中,受網(wǎng)絡(luò )路由等限制,一次較長(cháng)的報文可能在網(wǎng)絡(luò )傳輸過(guò)程中被分解成了好幾個(gè)包。一次讀取可能不能全部讀完一次報文,這就需要循環(huán)讀報文,直到讀完為止。
3.帶長(cháng)度報文頭循環(huán)讀寫(xiě)
這種情況一般是在長(cháng)連接進(jìn)程中,由于在長(cháng)連接中沒(méi)有條件能夠判斷循環(huán)讀寫(xiě)什么時(shí)候結束,所以必須要加長(cháng)度報文頭。讀函數先是讀取報文頭的長(cháng)度,再根據這個(gè)長(cháng)度去讀報文.實(shí)際情況中,報頭的碼制格式還經(jīng)常不一樣,如果是非ASCII碼的報文頭,還必須 轉換成ASCII,常見(jiàn)的報文頭碼制有:
(1)n個(gè)字節的ASCII碼
(2)n個(gè)字節的BCD碼
(3)n個(gè)字節的網(wǎng)絡(luò )整型碼
Socket通信模型
ServerSocket類(lèi)例子
int PORT = 8888; // 偵聽(tīng)端口
// 創(chuàng )建ServerSocket
ServerSocket serverSocket = new ServerSocket(PORT);// 開(kāi)始循環(huán)
while (true) {
// 等待連接
Socket socket = serverSocket.accept();
// 處理鏈接的線(xiàn)程類(lèi)
ServerThread st = new ServerThread(socket);
// 啟動(dòng)線(xiàn)程處理
new Thread(st).start();
}
客戶(hù)端的例子
int PORT = 8888; // 偵聽(tīng)端口
// 建立連接
socket = new Socket(“127.0.0.1”, 8888);
// 輸入數據的讀取
BufferedReader
netIn=newBufferedReader(new
InputStreamReader(socket.getInputStream()));
// 寫(xiě)入數據
PrintWriter netOut = new PrintWriter(socket.getOutputStream());
篇三:socket編程實(shí)驗心得體會(huì )
實(shí)驗心得體會(huì )
在本次實(shí)驗中,我通過(guò)對網(wǎng)絡(luò )課上所學(xué)知識的應用,學(xué)到了很多實(shí)踐中的知識。并且加深了我對課本知識的理解和認識,在實(shí)驗過(guò)程中,更容易記憶和深入理解各種協(xié)議的工作以及在網(wǎng)絡(luò )編程中應該注意的一系列問(wèn)題。
我們的第一個(gè)實(shí)驗是對ARP、ICMP、FTP和HTTP協(xié)議的分析和驗證。在利用軟件Etherpeek抓取在主機通信中的報文,得到了很多的關(guān)于這些協(xié)議的具體參數。在課程學(xué)習過(guò)程中,書(shū)本和老師給我的感覺(jué)就是太枯燥,通過(guò)課本的學(xué)習根本沒(méi)有辦法理解各種協(xié)議的工作細節。有很多的細微之處是想不通的。但是,在本次實(shí)驗中,我就通過(guò)各種報文的分析,看到了網(wǎng)絡(luò )中不同層次協(xié)議之間的協(xié)做過(guò)程。對應不同層之間就是通過(guò)協(xié)議來(lái)使用,我對整個(gè)網(wǎng)路的大體架構有了一個(gè)統籌的了解,雖然對很多的更深入的知識不是很了解,但是比我在課上學(xué)的東西要更有趣,而且容易學(xué)習,更能夠我學(xué)習的興趣。 第二個(gè)實(shí)驗是Socket編程實(shí)驗。在編寫(xiě)網(wǎng)絡(luò )程序之前,我對網(wǎng)路通信可以說(shuō)一無(wú)所知,根本不知道那些網(wǎng)路上的程序是怎么通過(guò)網(wǎng)路進(jìn)行通信的。在本次實(shí)驗中,終于揭開(kāi)了他們神秘的面紗。當然在實(shí)驗中出現了很多的插曲,我是在Linux環(huán)境下編寫(xiě)的程序,很多技術(shù)方面的問(wèn)題都無(wú)法解決。查閱書(shū)籍和網(wǎng)上咨詢(xún)才弄懂了他們的來(lái)龍去脈,最終是將我的程序編寫(xiě)完了。開(kāi)始接觸網(wǎng)路編程時(shí),那是一頭霧水,根本不知從何下手。在看了輔導教員給我們程序之后才有了很多的起色,才能夠自己編寫(xiě)程序。在網(wǎng)絡(luò )編程中,我最深的體會(huì )就是對具體的內部細節不熟悉,導致在調試的過(guò)程中感覺(jué)到很無(wú)力。在很多函數的作用下,經(jīng)常就是一團亂麻。之后,我每次編寫(xiě)之前就是將用到的函數的用法溫習一下,最后還是能夠解決很多的問(wèn)題的。
本次試驗是我們學(xué)習網(wǎng)路的第一次。以前的課程從來(lái)沒(méi)有接觸到網(wǎng)路方面的知識。這次的新知識對我們的挑戰還算不是太大,通過(guò)我們的努力,所有的困難時(shí)被克服掉了。其實(shí),實(shí)驗應該是我們的重點(diǎn),在以后的工作中要的就是我們的實(shí)際的動(dòng)手能力,如果我們在學(xué)習期間就是只學(xué)了書(shū)本上的知識,那樣對理論的了解是不夠深刻的,只有通過(guò)實(shí)驗才能激發(fā)我們的學(xué)習興趣?傊,我覺(jué)得實(shí)驗才是檢驗理論的唯一標準。
【socket技術(shù)要點(diǎn)總結】相關(guān)文章:
青蝦養殖技術(shù)要點(diǎn)02-21
技師技術(shù)總結范文精選03-19
調車(chē)長(cháng)技師技術(shù)總結04-27
申報技師技術(shù)的總結5篇02-25
居民死亡原因醫學(xué)證明填寫(xiě)要點(diǎn)參閱02-27
健身房跑步減肥計劃的三要點(diǎn)03-19
掘進(jìn)技術(shù)員工作總結02-21