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