套接字(Java Socket)

套接字

Java Socket一般指本詞條

套接字(socket)是一個抽象層,應用程式可以通過它傳送或接收數據,可對其進行像對檔案一樣的打開、讀寫和關閉等操作。套接字允許應用程式將I/O插入到網路中,並與網路中的其他應用程式進行通信。網路套接字是IP位址與連線埠的組合。

基本介紹

  • 中文名:套接字
  • 外文名:socket
  • 實質:一種獨立於協定的網路編程接口
  • 類型:流式套接字、數據報套接字和原始套接字
  • 作用:完成兩個應用程式之間的數據傳輸
  • 學科:計算機網路
簡述,發展,分類,創建套接字,關閉套接字,調用流程,

簡述

傳輸層實現端到端的通信,因此,每一個傳輸層連線有兩個端點。那么,傳輸層連線的端點是什麼呢?不是主機,不是主機的IP位址,不是套用進程,也不是傳輸層的協定連線埠。傳輸層連線的端點叫做套接字(socket)。根據RFC793的定義:連線埠號拼接到IP位址就構成了套接字。所謂套接字,實際上是一個通信端點,每個套接字都有一個套接字序號,包括主機的IP位址與一個16位的主機連線埠號,即形如(主機IP位址:連線埠號)。例如,如果IP位址是210.37.145.1,而連線埠號是23,那么得到套接字就是(210.37.145.1:23)。
總之,套接字Socket=(IP位址:連線埠號),套接字的表示方法是點分十進制的IP位址後面寫上連線埠號,中間用冒號或逗號隔開。每一個傳輸層連線唯一地被通信兩端的兩個端點(即兩個套接字)所確定。
套接字可以看成是兩個網路應用程式進行通信時,各自通信連線中的一個端點。通信時,其中的一個網路應用程式將要傳輸的一段信息寫入它所在主機的Socket中,該Socket通過網路接口卡的傳輸介質將這段信息傳送給另一台主機的Socket中,使這段信息能傳送到其他程式中。因此,兩個應用程式之間的數據傳輸要通過套接字來完成。
在網路應用程式設計時,由於TCP/IP的核心內容被封裝在作業系統中,如果應用程式要使用TCP/IP,可以通過系統提供的TCP/IP的編程接口來實現。在Windows環境下,網路應用程式編程接口稱作Windows Socket。為了支持用戶開發面向套用的通信程式,大部分系統都提供了一組基於TCP或者UDP的應用程式編程接口(API),該接口通常以一組函式的形式出現,也稱為套接字(Socket)。

發展

Socket最初是加利福尼亞大學Berkeley分校為Unix系統開發的網路通信接口。後來隨著TCP/IP網路的發展,Socket成為最為通用的應用程式接口,也是在Internet上進行套用開發最為通用的API
Windows系統流行起來之後,由Microsoft聯合了其他幾家公司在Berkeley Sockets的基礎之上進行了擴充(主要是增加了一些異步函式,並增加了符合Windows訊息驅動特性的網路事件異步選擇機制),共同制定了一套Windows下的網路編程接口,即Windows Sockets規範。Windows Sockets規範是一套開放的、支持多種協定的Windows下的網路編程接口,包括1.1版和2.0版兩個版本。其中1.1版只支持TCP/IP協定,而2.0版可以支持多協定,2.0版有良好的向後兼容性。當前Windows下的Internet軟體絕大部分都是基於Windows Socks開發的。

分類

為了滿足不同的通信程式對通信質量和性能的要求,一般的網路系統提供了三種不同類型的套接字,以供用戶在設計網路應用程式時根據不同的要求來選擇。這三種套接為流式套接字(SOCK-STREAM)、數據報套接字(SOCK-DGRAM)和原始套接字(SOCK-RAW)。
(1)流式套接字。它提供了一種可靠的、面向連線的雙向數據傳輸服務,實現了數據無差錯、無重複的傳送。流式套接字內設流量控制,被傳輸的數據看作是無記錄邊界的位元組流。在TCP/IP協定簇中,使用TCP協定來實現位元組流的傳輸,當用戶想要傳送大批量的數據或者對數據傳輸有較高的要求時,可以使用流式套接字。
(2)數據報套接字。它提供了一種無連線、不可靠的雙向數據傳輸服務。數據包以獨立的形式被傳送,並且保留了記錄邊界,不提供可靠性保證。數據在傳輸過程中可能會丟失或重複,並且不能保證在接收端按傳送順序接收數據。在TCP/IP協定簇中,使用UDP協定來實現數據報套接字。在出現差錯的可能性較小或允許部分傳輸出錯的套用場合,可以使用數據報套接字進行數據傳輸,這樣通信的效率較高。
(3)原始套接字。該套接字允許對較低層協定(如IP或ICMP)進行直接訪問,常用於網路協定分析,檢驗新的網路協定實現,也可用於測試新配置或安裝的網路設備。

創建套接字

以Berkeley Socket的一些基本的套接字系統調用為例。WinsockAPI也同樣具有這些調用。
1.創建套接字 socket()任何用戶要進行通信都必須創建套接字,創建套接字是通過系統調用socket()函式實現的。
(1)socket()函式調用的格式:
SOCKET PASCAL FAR socket(int af,int type,int protocol);
(2)socket()函式的參數:af,type,protocol。參數af指定套接字使用的協定族。也就是說,利用它來分辨地址的類型。UNIX支持的協定族有:UNIXDomain(AF_UNIX)、In-
temet(AF_INET)、XeroxNS(AF_NS)等。而Dos和Windows僅支持AF_INET。type參數指定所需的通信類型。包括數據流(SOCK_STREAM)、數據報(SOCK-DGRAM)和原始類型(S0CK_RAW)。參數protocol說明該套接字使用的協定族中的特定協定。如果調用者不希望特別指定使用的協定,則置為0,使用默認的連線模式。
(3)該函式調用成功,返回一個套接字描述符,該函式調用失敗,返回值為INVALID_SOCKET。

關閉套接字

當對某個套接字的通信結束時,必須調用該函式關閉指定的套接字。
函式格式:
BOOL closesocket(SOCKETs);
s是已結束通信任務要關閉的套接字的描述符。

調用流程

套接字調用流程如下圖所示。
套接字調用流程套接字調用流程
socket():創建套接字。
bind():指定本地地址。一個套接字用socket()創建後,它其實還沒有與任何特定的本地或目的地址相關聯。在很多情況下,應用程式並不關心它們使用的本地地址,這時就可以不用調用bind指定本地的地址,而由協定軟體為它們選擇一個。但是,在某個知名連線埠(Well-known Port)上操作的伺服器進程必須要對系統指定本地連線埠。所以一旦創建了一個套接字,伺服器就必須使用bind()系統調用為套接字建立一個本地地址。
connect():將套接字連線到目的地址。初始創建的套接字並未與任何外地目的地址關聯。客戶機可以調用connect()為套接字綁定一個永久的目的地址,將它置於已連線狀態。對數據流方式的套接字,必須在傳輸數據前,調用connect()構造一個與目的地的TCP連線,並在不能構造連線時返回一個差錯代碼。如果是數據報方式,則不是必須在傳輸數據前調用connect。如果調用了connect(),也並不像數據流方式那樣傳送請求建連的報文,而是只在本地存儲目的地址,以後該socket上傳送的所有數據都送往這個地址,程式設計師就可以免去為每一次傳送數據都指定目的地址的麻煩。
listen():設定等待連線狀態。對於一個伺服器的程式,當申請到套接字,並調用bind()與本地地址綁定後,就應該等待某個客戶機的程式來要求連線。listen()就是把一個套接字設定為這種狀態的函式。
accept():接受連線請求。伺服器進程使用系統調用socket,bind和listen創建一個套接字,將它綁定到知名的連線埠,並指定連線請求的佇列長度。然後,伺服器調用accept進入等待狀態,直到到達一個連線請求。
send()/recv()和sendto()/recvfrom():傳送和接收數據 。在數據流方式中,一個連線建立以後,或者在數據報方式下,調用了connect()進行了套接字與目的地址的綁定後,就可以調用send()和reev()函式進行數據傳輸。
closesocket():關閉套接字。

相關詞條

熱門詞條

聯絡我們