400 likes | 688 Views
Socket. Original by 黄嘉輝 Modification by 游象甫. Java 網際網路程式設計, 文魁資訊. Overview. Berkeley Socket Microsoft Windows Socket Java Socket. Socket Interface. 一種應用程式介面( API) 介於應用程式與硬體之間,並提供標準的函式以符合不同的網路硬體規格
E N D
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 • 建立socket • bind • 設定socket所使用的local端IP 位址及通訊埠 • listen • 設定socket等候(listen)Client端連結請求 • accept • 接受自Client端的連結請求並建立socket連結 • recv • 接收來自Client端所傳送的資料 (TCP) • read • 接收來自Client端所傳送的資料 (TCP)
Server端BSD API函式 (cont.) • recvfrom • 接收來自Client端所傳送的資料 (UDP) • send • 傳送資料至Client端 (TCP) • write • 傳送資料至Client端 (TCP) • sendto • 傳送資料至Client端 (UDP) • closesocket • 關閉通訊連結及socket,並且釋放系統資源 • shutdown • 關閉socket的傳送及接收功能
Client端BSD API函式 • socket • 建立socket • connect • 建立與Server端socket連線 • recv • 接收來自Server端所傳送的資料 (TCP) • read • 接收來自Server端所傳送的資料 (TCP) • recvfrom • 接收來自Server端所傳送的資料 (UDP)
Client端BSD API函式 (cont.) • send • 傳送資料至Server端 (TCP) • write • 傳送資料至Server端 (TCP) • 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 在傳遞資料之前,會先在主機間建立通訊連結,依據此通訊連結傳遞資料 • 可保證資料無誤送達,且到達順序與送出順序相同
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 應用程式 WinSock 應用程式 WinSock 1.1 winsock.dll (16 bit) wsock32.dll (32 bit) Winsock 2.0 ws2_32.dll (32 bit) TCP/IP Protocol Network WinSock API函數 • 由winsock.dll、wsock32.dll到ws2_32.dll,版本則由1.0、1.1至2.0版 • 下圖為WinSock API各版本之間的相容性
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 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 • DatagramSocketImplFactory • Class • 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