Top Banner
Socket Socket 程程程程 程程程程 : : JAVA JAVA 程程程 程程程 Jen-Chu Liu Jen-Chu Liu [email protected] [email protected]
75

Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu [email protected].

Dec 22, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Socket Socket 程式設計程式設計 ::以以 JAVAJAVA 為範例為範例

Socket Socket 程式設計程式設計 ::以以 JAVAJAVA 為範例為範例

Jen-Chu LiuJen-Chu Liu

[email protected]@simon.cs.nthu.edu.tw

Page 2: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

教學主旨• 讓各位了解網際網路程式運作方式與設

計方法• 了解 socket programming• 熟悉 Client/Server 程式設計架構• 利用 Java 作為範例程式

Page 3: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

大綱• TCP/IP 與 Port• Socket 介紹

– BSD socket– Microsoft Windows socket– Java Socket

• Server 端 Socket 程式架構• Client 端 Socket 程式架構

Page 4: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

TCP/IP與 Port

Page 5: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

TCP/IP• TCP – Transport Control Protocol

– 是一種連線型 (connection oriented) 和可靠性 (reliable) 的傳輸通訊協定。

• IP-Internet Protocol– 可以用來代表主機位址

HOST HOST

send receive

sendreceiveIP1 IP2

Page 6: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Port ( 通訊埠 )• 通訊協定通常是以 port 來區隔 Internet

各個應用服務的 .• 通常有 16bits 代表

– 216=65536 種• 編號 1~1023 是保留號 ( 公認 )

– 所以 programming 時要注意

Page 7: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Port ( 通訊埠 )( 續 )Port Service Protoco

l說明

20 FTP-Data TCP File Transport Protocol-Data

21 FTP TCP File Transport Protocol

23 Telnet TCP Telnet Service

25 SMTP TCP Simple Mail Transfer Protocol

80 HTTP TCP HyperText Transfer Protocol

110 POP3 TCP Post Office Protocol-version 3

Page 8: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Port ( 通訊埠 )( 續 )• Client 端要和 Server 端連線的時候 , 同樣需

要使用通訊埠與 Server 端連結 , 但是…– 所使用的意義不同 .– 埠號也不一定要相同 .

• 會用一個隨機暫時的號碼 , 用完後釋放 .• 在 win2000 下可以用 “ netstat –an” 指令查看 .

Page 9: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Port ( 通訊埠 )( 續 )• Linux/Unix:

– /etc/services

• Win2000: – C:\WINNT\System32\Drivers\etc\Services

Page 10: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Socket

• Berkeley Socket• Microsoft Windows Socket• Java Socket

Page 11: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

什麼是 Socket?• 是一種應用程式介面 (Interface).• 介於應用程式與硬體之間 , 並提供標準

的函式以符合不同的網路硬體規格 .• 不同的作業系統或應用程式所使用的 So

cket 會有一些差異 .

Page 12: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket• 是最早的 Socket Interface• 由加州的柏克萊大學所發展出來的• 是一組介面函式 , 介於應用程式與硬體

之間 .• 提供標準的函式 , 應用程式透過呼叫 So

cket Interface, 以發展具備有 TCP/IP 網路功能之應用 .

Page 13: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )

Application

Socket API

TCP UDP

Network

Page 14: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• 所提供的 Server 端的 API 函式 :

Server BSD Socket 說明socket 建立 socketbind 設定 socket 所使用的 local 端 IP 位址與通訊埠listen 設定 socket 等候 (listen)Client 端連結請求 (connection reque

st)accept 接受來自 Client 端的連結請求 , 並且建立 socket 連結

recvread

(TCP) 接收來自 Client 端所傳來的資料

recvfrom (UDP) 接收來自 Client 端所傳來的資料sendwrite

(TCP) 傳送資料至 Client 端

sendto (UDP) 傳送資料至 Client 端closesocket 關閉通訊連結及 socket, 並且釋放系統資源shutdown 關閉 socket 的傳送與接收的功能

Page 15: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• 所提供的 Client 端的 API 函式 :

Client BSD Socket 說明socket 建立 socket

connect 建立與 Server 端的 socket 連線recvread

(TCP) 接收來自 Server 端所傳來的資料

recvfrom (UDP) 接收來自 Server 端所傳來的資料sendwrite

(TCP) 傳送資料至 Server 端

sendto (UDP) 傳送資料至 Server 端closesocket 關閉通訊連結及 socket, 並且釋放系統資源shutdown 關閉 socket 的傳送與接收的功能

Page 16: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• Berkeley Socket 在網路應用程式開發上 ,

大致有下列兩大類 :– Stream Socket (Connection-Oriented Protoc

ol)– Datagram Socket (connectionless Protocol)

Page 17: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• Stream Socket 在 Server 端的開發流程

Socket()

Bind()

Listen()

Accept()

Closesocket()

Clientrecv() / read()

send() / write()

Page 18: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• Stream Socket 在 Client 端的開發流程

Socket()

Connect()

Closesocket()

Server

recv() / read()

send() / write()

Page 19: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Berkeley Socket (續 )• Datagram Socket 程式開發流程

Socket()

Bind()

Closesocket()

Sendto()

Recvfrom()

Page 20: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket

• 是 Microsoft 以 BSD socket API 為基礎所發展出來的 , 又稱為 Winsock

• 可以分成四大部分– BSD socket API– Winsock 延伸 (extended) 函數– 轉換 (conversion) 函數– 資料庫 (Database) 函數

Page 21: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

Application

Windows Socket APIWinsock.dllWsock32.dllWs2_32.dll

TCP UDP

Network

Page 22: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock API版本相容性

Winsock 應用程式

Winsock.dll (16bit)Wsock32.dll (32bit)

Ws2_32.DLL (32bit)

TCP/IP

Network

Winsock 應用程式

Winsock 2.0

Winsock 1.1

Page 23: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• BSD Socket API:這部分的功能已經慢慢被Winsock 延伸函數所取代

BSD Socket API 說明socket 建立 socketbind 設定 socket 所使用的 local 端 IP 位址與通訊埠listen 設定 socket 等候 (listen)Client 端連結請求 (connection request)accept 接受來自 Client 端的連結請求 , 並且建立 socket 連結

recv 接收來自另一 socket 所傳來的資料recvfrom 接收來自另一 socket 所傳來的資料 , 並且回傳此 socket 的資訊

send 傳送資料至另一 socketSendto 傳送資料至指定 IP 位址及通訊埠

closesocket 關閉通訊連結及 socket, 並且釋放系統資源shutdown 關閉 socket 的傳送與接收的功能

Page 24: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• BSD Socket API(續 ):

BSD Socket API 說明connect 建立 socket 之間的連線

getpeername 回傳 socket 所連結的 remote 端 IP 位址與通訊埠getsockname 回傳 socket 所連結的 local 端 IP 位址與通訊埠

getsockopt 回傳 socket 的選項值ioctlsocket 設定或回傳 socket參數值

select 設定 socket 的讀寫狀態並且執行同步的 I/O 傳輸setsockopt 設定 socket 的選項值

Page 25: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 延伸函數– 因應多工 (multi-task),事件導向 (event-dri

ven) 與訊息導向 (message-driven) 所發展的 API 函數

– 函數名稱均以 WSA 開頭

Page 26: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 延伸函數

Winsock Extended API

說明

WSAAccept accept 的延伸 winsock API, 接受來自 Client 端的連結請求 , 並且建立 socket 連結

WSARecv recv 的延伸 winsock API, 接收來自另一 socket 所傳來的資料WSARecvfrom recvfrom 的延伸 winsock API, 接收來自另一 socket 所傳來的資料 , 並且

回傳此 socket 的資訊WSASend send 的延伸 winsock API, 傳送資料至另一 socket

WSASendto sendto 的延伸 winsock API, 傳送資料至指定 IP 位址及通訊埠WSAConnect connect 的延伸 winsock API, 建立 socket 之間的連線

WSASelect select 的延伸 winsock API, 設定 socket 的讀寫狀態並且執行同步的 I/O傳輸

Page 27: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 延伸函數 : 與 Event 有關的 API

Winsock Extended API 說明WSACloseEvent 關閉 winsock事件WSACreatEvent 建立 winsock事件

WSAEnumNetworkEvents 回傳目前所有的 winsock事件WSAResetEvent 更新 winsock事件

WSASetEvent 設定 winsock事件WSAWaitForMultipleEvents 等待正在 blocking 的 winsock事件

Page 28: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 延伸函數 : 新增的 socket API

Winsock Extended API 說明WSACleanup 釋放所使用的 winsock

WSADuplicateSocket 建立虛擬 (virtual) 的 winsockWSAEnumProtocols 回傳所有的通訊協定之資訊

WSAGetLastError 回傳 Windows 所產生的最新的 winsock錯誤代碼WSASetLastError 設定 winsock錯誤代碼

WSAStartup 建立 Socket

Page 29: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 轉換 (Conversion) 函數– 主要用來做不同位元間的位元順序轉換

• Host Byte Order ( 主機位元順序 )•Network Byte Order ( 網路位元順序 )

address A+1 address Alittle-endian byte order: high-order byte low-order bytebig-endian byte order: high-order byte low-order byte(for a 16-bit integer) address A address A+1

Page 30: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 轉換函數

Winsock Extended API

BSD Socket API

說明

WSAHtonl Htonl 將 32 位元長整數 (long integer)從 host byte order 轉成 network byte order

WSAHtons Htons 將 16 位元長整數 (long integer)從 host byte order 轉成 network byte order

WSANtohl Ntohl 將 32 位元長整數 (long integer)從 network byte order 轉成 host byte order

WSANtohs Ntohs 將 16 位元長整數 (long integer)從 network byte order 轉成 host byte order

Inet_addr 將 IP 位址字串轉換為 32 位元 IP 位址

Inet_ntoa 將 32 位元 IP 位址轉換為 IP 位址字串

Page 31: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 資料庫函數– 其實與實際資料庫無關– 主要在處理 IP Address 與主機名稱 (domai

n name) 間的轉換– 也可以用來取得通訊協定 (protocol) 或通

訊埠 (port) 的相關資訊

Page 32: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 資料庫函數

BSD Socket API 說明gethostbyaddr 以主機 IP 位址取得主機的相關資訊

gethostbyname 以主機名稱取得主機的相關資訊gethostname 取得 local 主機名稱

getprotobyname 以通訊協定的名稱取得通訊協定的相關資訊getprotobynumbe

r以通訊協定的號碼取得通訊協定的相關資訊

getservbyname 以服務的名稱取得服務的相關資訊getservbyport 以服務的通訊埠及通訊協定取得服務的相關資訊

Page 33: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 資料庫函數

Winsock Extended API 說明WSAAsyncGethostbyaddr 以主機 IP 位址取得主機的相關資訊

WSAAsyncGethostbyname 以主機名稱取得主機的相關資訊WSAAsyncgethostname 取得 local 主機名稱

WSAAsyncGetprotobyname 以通訊協定的名稱取得通訊協定的相關資訊WSAAsyncGetprotobynumber 以通訊協定的號碼取得通訊協定的相關資訊

WSAAsyncGetservbyname 以服務的名稱取得服務的相關資訊WSAAsyncGetservbyport 以服務的通訊埠及通訊協定取得服務的相關資訊

Page 34: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock 在網路應用程式開發上 , 一樣可以分成 :– Stream Socket (Connection-Oriented Protoc

ol)– Datagram Socket (connectionless Protocol)

Page 35: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock Stream Socket Client/Server

WSAStartup

Bind

Listen

WSAAccept

WSACleanup

WSARecv / WSASend

WSASend / WSARecv

Connect()

WSACleanup

WSAStartup

Server Client

Page 36: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Microsoft Windows Socket (續 )

• Winsock Datagram Socket

WSAStartup

Bind

WSACleanup

WSASendto

WSARecvfrom

Page 37: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket• Java 最初設計的目的有下列考量 :

– 與 OS 及 Platform無關的程式語言•跨平台 (Cross Platform)

– 物件導向 (Object Oriented)– 增強WWW 與使用者互動的模式– 支援 Internet Programming– …

Page 38: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• Java API:

– Java.net (Networking)– Javax.net.ssl (Networking with Secure S

ocket Layer)– Java.rmi (Remote Method Invocation)– Javax.rmi (Remote Method Invocation fo

r IIOP)

PS: IIOP (Internet Inter-ORB Protocol) ORB (Object Request Broker)

Page 39: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• 以 Java.net而言 ,其 API 可以分成以下幾類 :– 處理 URL– 處理主機名稱及 IP Address– 處理 TCP 與 UDP 通訊協定– 處理網路認證 (Authentication) 與權限 (pe

rmission)– 內容處理器 (ContentHandler)

Page 40: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• 處理 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

Page 41: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• 處理主機名稱及 IP Address 的類別與方法有 :

– Class• Java.net.InetAddress

– Method• Public byte[] get address()• Public static InetAddress[] getAllByName(string host) throws Unkn

ownHostException• Public static InetAddress getByName(string host) throws Unknown

HostException• Public String getHostAddress()• Public String getHostName()• Public static InetAddress getLoaclHost() throws UnknownHostExce

ption– Exception

• Java.net.UnknownHostException

Page 42: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• 處理 UDP 通訊協定

– Interface• DatagramSocketImplFactory

– Class• Java.net.DatagramPacket• Java.net.DatagramSocket• Java.net.DatagramSocketImpl• Java.net.MulticastSocket

– Exception• Java.net.SocketException

Page 43: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• 處理 TCP 通訊協定

– Interface• SocketImplFactory• SocketOptions

– Class• Java.net.ServerSocket• Java.net.Socket• Java.net.SocketImpl

– Exception• Java.net.BindException• Java.net.ConnectionException• Java.net.NoRouteToHostException• Java.net.ProtocolException• Java.net.SocketException

Page 44: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )•處理網路認證 (Authentication) 與權限

(permission)– Class

• Java.net.Authenticator• Java.net.NetPermission• Java.net.PasswordAuthentication• Java.net.SocketPermission• Java.net.SocketException

Page 45: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )•內容處理器 (ContentHandler)

– Interface• ContentHandlerFactory

– Class• Java.net.ContentHandler• Java.net.SocketException

Page 46: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• Java.net中支援 Stream socket (TCP) Server 端與 Client 端網路應用程式相關的 API:

Java API 說明

Server

Java.net.ServerSocket 建立 Server 端 socket 及設定所使用的 IP 位址及通訊埠

Accept 等候及接受來自 Client 端連結請求 , 並且建立與Client 端之連線

Read(java.io.DataInputStream)

接收來自 Client 端所傳送之資料

Write(java.io.DataOutputStream)

傳送資料到 Client

close 關閉 socket, 同時也關閉與 Client 端連結

ClientJava.net.Socket 建立 Client 端 socket, 並且嘗試建立與 Server

端的連結Read(java.io.DataInputStream)

接收來自 Server 端所傳送之資料

Write(java.io.DataOutputStream)

傳送資料到 Server

close 關閉 socket, 同時也關閉與 Server 端連結

Page 47: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )

ServerSocket

Accept

Close

read / send

send / read

Socket

Close

Server Client

• Java Stream Socket

Page 48: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• Java.net中支援 Datagram Socket (UDP) 應用程式相關的 API:

Java API 說明

Java.net.DatagramSocket 建立 Datagram socket

Java.net.DatagramPacket 建立 Datagram packet( 資料封包 )

Receive (DatagramSocket) 接收 Datagram packet( 資料封包 )

Send (DatagramSocket) 傳送 Datagram packet( 資料封包 )

Close 關閉 Datagram socket

Page 49: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

JAVA Socket (續 )• Java Datagram Socket

DatagramSocket

DatagramPacket

Close

send

receive

Page 50: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Server 端 Socket 程式架構

Page 51: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

步驟• 建立 Server 端的 socket, 並且等候 Client

端的連結請求•當 Server 端偵測到 Client 端的連結請求

時 ,則接受並藉此建立 Client 端之 socket•處理來自 Client 端的資訊 (Request)•回應給 Client 端 (Response)• 連線結束後關閉 socket

Client Server

請求 (Request)

回應 (Response)

Page 52: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Server 端 socket• 欲建立 Server 端 socket, 可使用以下 java.ne

t 的建構子 (constructor):

– Public ServerSocket(int port) throws IOException– Public ServerSocket(int port, int backlog) throws IOExce

ption– Public ServerSocket(int port, int backlog, InetAddress bi

ndAddr) throws IOException

Page 53: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Server 端 socket ( 續 )

•參數介紹 :– Port: 指定通訊端通訊埠 , 可為 1~65535未被使用的號碼 ,若使用已使用的號碼 , 會產生 IOException錯誤 ,若設為 0,則會由 ServerSocket 自動尋找未被使用的號碼 .

– Backlog: 表示最大可以連結的 Client 數 ,預設值是 50.

– bindAddr: 如果主機有一個以上的 IP,才需要用這個參數來指定要 bind 的 IP 位址 , 格式為 InetAddress形式 .

Page 54: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Server 端 socket ( 續 )

• 建立 Server 端 socket 的程式架構大致如下 :

Void startServer() { ServerSocket serverSocket; int port = <Port Number>; try { serverSocket = new ServerSocket(port); … } catch (IOException ex) { … }}

Page 55: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Server 端 Socket 資訊

• Server 端 socket 以 ServerSocket 建立之後 , 可以使用以下方法取得 Server 端socket 的相關資訊 :– Public InetAddress GetInetAddress()– Public int getLocalPort()

•回傳所使用的通訊埠號

Page 56: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Server 端 Socket 資訊( 續 )

• GetInetAddress(): 取得 Server 端 socket 的 IP 及主機名稱等資訊 , 並以 InetAddress 類別形式回傳 ,因此可以使用 InetAddress 的下列方法取得 Server 端 socket 的相關資訊 :

– Public byte[] getAddress()– Public static InetAddress[] getAllByName(String host) throws U

nknownHostException– Public static InetAddress GetByName(String host) throws Unkn

ownHostException– Public String getHostAddress– Public String getHostName()– Public static InetAddress getLocalHost() throws UnknownHostE

xception• 傳回的格式是 “ Host name / IP address”

Page 57: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Server 端 Socket 資訊( 續 )

• 如果主機有一個以上的 IP, 可先使用 getAllByName 方法取得主機的所有 IP,再以 getHostAddress 及 getHostName 方法分別取得個別對應的名稱位址

ServerSocket serverSocket = new ServerSocket(<port>);InetAddress[] addrs = serverSocket.getInetAddress().getAllByName(“<host name>”);

For (int i=0; i < addrs.length; i++) { System.out.println(addrs[i].getHostName()); System.out.println(addrs[i].getHostAddress());}

Page 58: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Server 端 Socket 資訊 ( 續 )

範例實作 : 請利用前述的方法試寫出一個小程式可以擷取本身電腦的 IP, host name 資訊 .

Page 59: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接受 Client 端連結• 以 ServerSocket 建立 Server 端的 socket 之

後 , 基本上 Server 的雛型已經具備了 , 接著便是等候及接受來自 Client 端的連線 .

• 處理 Client 端連線 , 可以使用 ServerSocket類別的 accept 方法 :– Public Socket accept() throws IOException

Page 60: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接受 Client 端連結 ( 續 )• 用 thread 的方式為每一個 Client 端建立各自的執行緒

ServerSocket serverSocket = new ServerSocket(port);

Thread thread = new Thread(new listenClient(serverSocket));Thread.start();…

Class listenClient implements Runnable { private ServerSocket serverSocket; private Socket clientSocket;

public listenClient (ServerSocket serverSocket) { this.serverSocket = serverSocket; }Public void run() { try { while (true) { socket clientSocket = serverSocket.accept(); … } } catch (IOException ex) { … }}}

Page 61: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接受 Client 端連結 ( 續 )• 在建立 Client 端 socket物件之後 , 同樣可以使用 getInetAddr

ess 來取得所連結 Client 端的 IP adress• 設計一個 Server 程式可以等候 Client 連線 , 並顯示 Client 的 I

P

Page 62: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接收與傳送— Server 端• 當 Server 端以 accept 方法建立 Client 端 soc

ket物件之後 ,便可以使用 socket物件所提供的方法傳送與接收來自 Client 端的資料

– Public InputStream getInputStream() throws IOException

– Public OutputStream getOutputStream() throws IOException

Page 63: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接收與傳送— Server 端 ( 續 )

• getInputStream: 取得 Client 所輸入的資料流– Java.io.DataInputStream

• read, readBoolean, readByte, readChar, readDouble• readFloat, readFully, readInt, readLong, readShort• readUnsignedByte, readUnsignedShort, readUTF

– Java.io.BufferedReader• read, readLine

Try { Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader( new InputStreamReader(cs.getInputStream())); String inData = in.readLine(); …}

Page 64: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

接收與傳送— Server 端 ( 續 )

• getOutputStream: 取得輸出到 Client 端的資料流– Java.io.DataOutputStream

• write, writeBoolean, writeByte, writeBytes, writeChar• writeDouble, writeFloat, writeInt, writeLong, writeShort• writeUTF

– Java.io.BufferedWriter• write

Try { Socket clientSocket = serverSocket.accept(); DataOutputStream out = null; out = new DataOutputStream(clientSocket, getOutputStream()); out.writeUTF(<Data>); …}

Page 65: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

關閉連結— Server 端• 用 ServerSocket 類別的 close 方法關閉 Ser

ver 端 socket 並釋放資源– Public void close() throws IOException

• Client 端也要作喔…

• 看範例…

Page 66: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

Client 端 Socket 程式架構

Page 67: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

步驟• 建立 Client 端 Socket,再建立時需指定欲連結

Server 端的主機名稱 ( 或 IP) 與 Internet 服務的 port

• 傳送特定資訊或指令至 Server 端• 接收 Server 端回傳的執行結果或錯誤訊息• 當 Client 端不需 Server 端的處理時 ,便關閉

Socket 通訊連結– 此外 ,Clinet 端程式常為一般使用者所使用 ,因此 ,

使用者介面 (user interface) 也要好好設計 .

Page 68: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Client 端 Socket• 欲建立 Client 端 socket, 可使用以下 java.net

的建構子 (constructor):– Public Socket(InetAddress address, int port) throws IOEx

ception– Public Socket(InetAddress address, int port, InetAddress

localAddr, int localPort) throws IOException– Public Socket(String host, int port, InetAddress localAddr,

int localPort) throws UnknownHostException, IOException

Page 69: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Client 端 Socket( 續 )• 參數說明 :

– Address: 設定 Server 端 IP, 為 InetAddress形式– Port: 設定 Server 端所提供之 Internet 服務埠– LocalAddr: 若 Client 有一個以上的 IP,則利用此方

法指定由哪一個 IP 和 Server 連線– LocalPort: 指定 Client 端以哪個 port 與 Server 相

連– Host: 除了可以指定 Server 主機 IP,亦可利用此方

法指定 Server 主機名稱 , 但須配合 DNS 運作 ,否則會產生 UnknownHostException錯誤

Page 70: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

建立 Client 端 Socket( 續 )• 程式架構大致如下 :

Socket socket;Int port = <Port Number>;

Try { socket = new Socket(InetAddress.getByName(“<Host Name>”), port); …}

Catch ( IOException ex) { …}

Page 71: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Client 端 Socket 資訊• Client 端 socket除了提供取得 local 端

所使用的 IP 與 Port 之外 , 也提供連結 Server 端資訊的 API:– Public InetAddress getLocalAddress()– Public int getLocalPort()– Public InetAddress getInetAddress()– Public int getLocalPort()

Page 72: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Client 端 Socket 資訊( 續 )

• GetLocalAddress(): 取得 Client 端 socket 的 IP 及主機名稱等資訊 , 並以 InetAddress 類別形式回傳 ,因此可以使用 InetAddress 的下列方法取得 Client 端 socket 的相關資訊 :

– Public byte[] getAddress()– Public static InetAddress[] getAllByName(String host) throws Unknown

HostException– Public static InetAddress GetByName(String host) throws UnknownHos

tException– Public String getHostAddress– Public String getHostName()– Public static InetAddress getLocalHost() throws UnknownHostExceptio

n• 傳回的格式是 “ Host name / IP address”

Page 73: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

取得 Client 端 Socket 資訊( 續 )

• getLocalPort: 回傳 Client 端 socket 所使用的埠號

• getInetAddress 與 getPort 的用法則與 Server 端所使用的相同 .

– 看範例…

Page 74: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

傳送與接收— Client 端• 和前述 Server 端的做法相同

– 傳出為” write”– 接收為” read”

Page 75: Socket 程式設計 : 以 JAVA 為範例 Jen-Chu Liu ikiyama@simon.cs.nthu.edu.tw.

關閉連結— Client 端• 和 Server 端一樣

– Public void close() throws IOException• 看範例…