Original by 黄嘉輝 Modification by 游象甫 Socket Original by 黄嘉輝 Modification by 游象甫 Java 網際網路程式設計, 文魁資訊
Overview Berkeley Socket Microsoft Windows Socket Java Socket
Socket Interface 一種應用程式介面(API) 介於應用程式與硬體之間,並提供標準的函式以符合不同的網路硬體規格 最早的Socket Interface於1980年代由加州柏克萊大學為支援UNIX作業系統上的TCP/IP應用所開發的Socket介面,稱為Berkeley Socket Interface,而其軟體則稱為Berkeley Software Distribution (BSD)
Berkeley Socket Berkeley Socket Interface是一組函式,介於網路應用程式與作業系統及網路硬體間,應用程式透過呼叫Socket Interface,發展具有TCP/IP網路功能之應用
Server端BSD API函式 socket bind listen accept recv read 建立socket 設定socket所使用的local端IP 位址及通訊埠 listen 設定socket等候(listen)Client端連結請求 accept 接受自Client端的連結請求並建立socket連結 recv 接收來自Client端所傳送的資料 (TCP) read
Server端BSD API函式 (cont.) recvfrom 接收來自Client端所傳送的資料 (UDP) send 傳送資料至Client端 (TCP) write sendto 傳送資料至Client端 (UDP) closesocket 關閉通訊連結及socket,並且釋放系統資源 shutdown 關閉socket的傳送及接收功能
Client端BSD API函式 socket connect recv read recvfrom 建立socket 建立與Server端socket連線 recv 接收來自Server端所傳送的資料 (TCP) read recvfrom 接收來自Server端所傳送的資料 (UDP)
Client端BSD API函式 (cont.) send 傳送資料至Server端 (TCP) write sendto 傳送資料至Server端 (UDP) closesocket 關閉通訊連結及socket,並且釋放系統資源 shutdown 關閉socket的傳送及接收功能
Berkeley Socket網路應用 Berkeley Socket在網路應用程式開發上,大致有下列兩類 Stream Socket(Connection-Oriented Protocol) Datagram Socket(Connectionless Protocol)
BSD Stream Socket 使用TCP傳送資料 TCP 在傳遞資料之前,會先在主機間建立通訊連結,依據此通訊連結傳遞資料 可保證資料無誤送達,且到達順序與送出順序相同
Server端Stream Socket連線流程
Client端Stream Socket連線流程
BSD Datagram Socket 使用UDP傳送資料 與TCP不同的是,TCP在傳遞資料之前須先建立通訊連結,但UDP則不需要,僅須設定電腦間的IP及使用的Port,則可互相傳遞訊息 UDP不提供資料錯誤的偵測及資料重送等機制,因此並不確保資料能完整送達
Datagram Socket連線流程 由於不必建立雙方的連線,因此只需利用sendto及recvfrom傳送及接收資料 最後仍利用closesocket關閉Socket並釋放系統資源
MS Windows Socket Microsoft Windows Socket(簡稱WinSock),是Microsoft以Berkeley Socket API為基礎所發展出來的 在MS Windows 3.1之前,Windows並不包含支援TCP/IP的Socket API,因此在網路功能上相對地不足 支援網路功能則由Third-Party協力廠商開發 Trumpet WinSock、Chameleon、NetWare支援TCP/IP的Socket API應用函式庫
WinSock (cont.)
WinSock API函數 由winsock.dll、wsock32.dll到ws2_32.dll,版本則由1.0、1.1至2.0版 ws2_32.dll (32 bit) TCP/IP Protocol Network WinSock 1.1 winsock.dll (16 bit) wsock32.dll (32 bit) Winsock 2.0
WinSock API函數 (cont.) WinSock API可分為四大類 BSD Socket API WinSock延伸(Extended)函數 轉換(Conversion)函數 資料庫(Database)函數
WinSock BSD API 以BSD Socket API為基礎所發展出來的 在Winsock 2.0已漸漸被Winsock延伸函數(Extended API)所取代 主要功能在於建立socket連線、傳送或接收數資料
WinSock延伸(Extended)函數 因應Windows的Multi-Task、Event-Driven與Message-Driven的環境,以BSD Socket API為基礎而發展出的WinSock API函數 提供BSD Socket API所沒有的非同步(Asynchronous)及訊息導向的Socket API 為了區別起見,Winsock延伸函數均以WSA開頭 大部分的WinSock延伸函數的功能與BSD Socket API差不多 例如BSD Socket API的connect相對應的WinSock延伸函數則是WSAConnect
WinSock延伸(Extended)函數 (cont.) WSAAccept 接受自Client端的連結請求並建立socket連結 WSAConnect 建立socket之間的連線 WSARecv 接收來自Client端所傳送的資料 (TCP) WSARecvFrom 接收來自Client端所傳送的資料 (UDP) WSASelect 設定socket的讀寫狀態的I/O傳輸 WSASend 傳送資料至Client端 (TCP) WSASendTo 傳送資料至Client端 (UDP)
WinSock延伸(Extended)函數 (cont.) WSASocket 建立socket WSACloseEvent 關閉WinSock事件 WSACreateEvent 建立WinSock事件 WSAResetEvent 更新WinSock事件 WSASetEvent 設定WinSock事件 WSAEnumNetworkEvents 回傳目前所有的WinSock事件 WSAWaitForMultipleEvents 等待正在blocking的WinSock事件
WinSock 轉換(Conversion)函數 主要將32 bit或16 bit的整數從主機位元順序(Host Byte Order)轉換為網路位元順序(Network Byte Order),或者是由網路位元順序轉為主機位元順序 也提供32位元IP位址與ASCII位址之間的轉換
WinSock 轉換(Conversion)函數 (cont.) WSAHtonl 將32位元長整數從主機位元順序(host byte order)轉換至網路位元順序(network byte order) WSAHtons 將16 位元短整數從主機位元順序(host byte order)轉換至網路位元順序(network byte order) WSANtohl 將32 位元長整數從網路位元順序(network byte order) 轉換至主機位元順序(host byte order) WSANtohs 將16 位元短整數從網路位元順序(network byte order) 轉換至主機位元順序(host byte order)
WinSock資料庫(Database)函數 雖名為資料庫函數,但與資料庫並無關聯 主要在處理IP Address與主機名稱(DNS Name)間的轉換或者取得通訊協定或通訊埠(Port)等相關資訊
WinSock資料庫(Database)函數 (cont.) WSAAsyncGetHostByAddr 以主機IP位址執行非同步取得主機的相關資訊 WSAAsyncGetHostByName 以主機名稱執行非同步取得主機的相關資訊 WSAAsyncGetProtoByName 以通訊協定的名稱執行非同步取得通訊協定的相關資訊 WSAAsyncGetProtoByNumber 以通訊協定的號碼執行非同步取得通訊協定的相關資訊 WSAAsyncGetServByName 以服務的名稱及通訊協定執行非同步取得服務的相關資訊 WSAAsyncGetServByPort 以服務的通訊埠及通訊協定執行非同步取得服務的相關資訊
WinSock網路應用 WinSock的應用程式可分為兩類 Stream Socket Datagram Socket
WinSock Stream Socket流程
WinSock Datagram Socket流程 不需要事先建立連線,因此傳遞資料的雙方並無實際的連線關係存在,只需利用WSARecvFrom及WSASendTo接收及傳送資料
Java Socket Java支援網路的API java.net (Networking) javax.net.ssl (Networking with Secure Socket Layer) java.rmi (Remote Method Invocation) javax.rmi (Remote Method Invocation for IIOP)
java.net 其API分為以下幾類 處理URL(Uniform Resource Locator) 處理主機名稱及IP Address 處理UDP(User Datagram Protocol)通訊協定 處理TCP(Transmission Control Protocol)通訊協定 處理網路認證(Authentication)及權限(Permission) 內容處理器(ContentHandler)
處理URL Interface URLStreamHandlerFactory Class java.net.HttpURLConnection java.net.JarURLConnection java.net.URL java.net.URLClassLoader java.net.URLConnection java.net.URLDecoder java.net.URLEncoder java.net.URLStreamHandler Exception java.net.MalformedURLException java.net.UnknownServiceException
處理主機名稱及IP Address Class java.net.InetAddress Method public byte[] getAddress() public static InetAddress[] getAllByName(String host) throws UnknownHostException public static InetAddress getByName(String host) throws UnknownHostException public String getHostAddress() public String getHostName() public static InetAddress getLocalHost() throws UnknownHostException Exception java.net.UnknownHostException
處理UDP通訊協定 Interface Class Exception DatagramSocketImplFactory java.net.DatagramPacket java.net.DatagramSocket java.net.DatagramSocketImpl java.net.MulticastSocket Exception java.net.SocketException
處理TCP通訊協定 Interface SocketImplFactory SocketOptions Class java.net.ServerSocket java.net.Socket java.net.SocketImpl Exception java.net.BindException java.net.ConnectException java.net.NoRouteToHostException java.net.ProtocolException java.net.SocketException
處理網路認證及權限 Class java.net.Authenticator java.net.NetPermission java.net.PasswordAuthentication java.net.SocketPermission
Java Stream Socket流程
Java Datagram Socket流程