socket 程式設計 : 以 java 為範例 jen-chu liu [email protected]
Post on 22-Dec-2015
278 views
TRANSCRIPT
Socket Socket 程式設計程式設計 ::以以 JAVAJAVA 為範例為範例
Socket Socket 程式設計程式設計 ::以以 JAVAJAVA 為範例為範例
Jen-Chu LiuJen-Chu Liu
[email protected]@simon.cs.nthu.edu.tw
教學主旨• 讓各位了解網際網路程式運作方式與設
計方法• 了解 socket programming• 熟悉 Client/Server 程式設計架構• 利用 Java 作為範例程式
大綱• TCP/IP 與 Port• Socket 介紹
– BSD socket– Microsoft Windows socket– Java Socket
• Server 端 Socket 程式架構• Client 端 Socket 程式架構
TCP/IP與 Port
TCP/IP• TCP – Transport Control Protocol
– 是一種連線型 (connection oriented) 和可靠性 (reliable) 的傳輸通訊協定。
• IP-Internet Protocol– 可以用來代表主機位址
HOST HOST
send receive
sendreceiveIP1 IP2
Port ( 通訊埠 )• 通訊協定通常是以 port 來區隔 Internet
各個應用服務的 .• 通常有 16bits 代表
– 216=65536 種• 編號 1~1023 是保留號 ( 公認 )
– 所以 programming 時要注意
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
Port ( 通訊埠 )( 續 )• Client 端要和 Server 端連線的時候 , 同樣需
要使用通訊埠與 Server 端連結 , 但是…– 所使用的意義不同 .– 埠號也不一定要相同 .
• 會用一個隨機暫時的號碼 , 用完後釋放 .• 在 win2000 下可以用 “ netstat –an” 指令查看 .
Port ( 通訊埠 )( 續 )• Linux/Unix:
– /etc/services
• Win2000: – C:\WINNT\System32\Drivers\etc\Services
Socket
• Berkeley Socket• Microsoft Windows Socket• Java Socket
什麼是 Socket?• 是一種應用程式介面 (Interface).• 介於應用程式與硬體之間 , 並提供標準
的函式以符合不同的網路硬體規格 .• 不同的作業系統或應用程式所使用的 So
cket 會有一些差異 .
Berkeley Socket• 是最早的 Socket Interface• 由加州的柏克萊大學所發展出來的• 是一組介面函式 , 介於應用程式與硬體
之間 .• 提供標準的函式 , 應用程式透過呼叫 So
cket Interface, 以發展具備有 TCP/IP 網路功能之應用 .
Berkeley Socket (續 )
Application
Socket API
TCP UDP
Network
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 的傳送與接收的功能
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 的傳送與接收的功能
Berkeley Socket (續 )• Berkeley Socket 在網路應用程式開發上 ,
大致有下列兩大類 :– Stream Socket (Connection-Oriented Protoc
ol)– Datagram Socket (connectionless Protocol)
Berkeley Socket (續 )• Stream Socket 在 Server 端的開發流程
Socket()
Bind()
Listen()
Accept()
Closesocket()
Clientrecv() / read()
send() / write()
Berkeley Socket (續 )• Stream Socket 在 Client 端的開發流程
Socket()
Connect()
Closesocket()
Server
recv() / read()
send() / write()
Berkeley Socket (續 )• Datagram Socket 程式開發流程
Socket()
Bind()
Closesocket()
Sendto()
Recvfrom()
Microsoft Windows Socket
• 是 Microsoft 以 BSD socket API 為基礎所發展出來的 , 又稱為 Winsock
• 可以分成四大部分– BSD socket API– Winsock 延伸 (extended) 函數– 轉換 (conversion) 函數– 資料庫 (Database) 函數
Microsoft Windows Socket (續 )
Application
Windows Socket APIWinsock.dllWsock32.dllWs2_32.dll
TCP UDP
Network
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
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 的傳送與接收的功能
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 的選項值
Microsoft Windows Socket (續 )
• Winsock 延伸函數– 因應多工 (multi-task),事件導向 (event-dri
ven) 與訊息導向 (message-driven) 所發展的 API 函數
– 函數名稱均以 WSA 開頭
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傳輸
Microsoft Windows Socket (續 )
• Winsock 延伸函數 : 與 Event 有關的 API
Winsock Extended API 說明WSACloseEvent 關閉 winsock事件WSACreatEvent 建立 winsock事件
WSAEnumNetworkEvents 回傳目前所有的 winsock事件WSAResetEvent 更新 winsock事件
WSASetEvent 設定 winsock事件WSAWaitForMultipleEvents 等待正在 blocking 的 winsock事件
Microsoft Windows Socket (續 )
• Winsock 延伸函數 : 新增的 socket API
Winsock Extended API 說明WSACleanup 釋放所使用的 winsock
WSADuplicateSocket 建立虛擬 (virtual) 的 winsockWSAEnumProtocols 回傳所有的通訊協定之資訊
WSAGetLastError 回傳 Windows 所產生的最新的 winsock錯誤代碼WSASetLastError 設定 winsock錯誤代碼
WSAStartup 建立 Socket
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
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 位址字串
Microsoft Windows Socket (續 )
• Winsock 資料庫函數– 其實與實際資料庫無關– 主要在處理 IP Address 與主機名稱 (domai
n name) 間的轉換– 也可以用來取得通訊協定 (protocol) 或通
訊埠 (port) 的相關資訊
Microsoft Windows Socket (續 )
• Winsock 資料庫函數
BSD Socket API 說明gethostbyaddr 以主機 IP 位址取得主機的相關資訊
gethostbyname 以主機名稱取得主機的相關資訊gethostname 取得 local 主機名稱
getprotobyname 以通訊協定的名稱取得通訊協定的相關資訊getprotobynumbe
r以通訊協定的號碼取得通訊協定的相關資訊
getservbyname 以服務的名稱取得服務的相關資訊getservbyport 以服務的通訊埠及通訊協定取得服務的相關資訊
Microsoft Windows Socket (續 )
• Winsock 資料庫函數
Winsock Extended API 說明WSAAsyncGethostbyaddr 以主機 IP 位址取得主機的相關資訊
WSAAsyncGethostbyname 以主機名稱取得主機的相關資訊WSAAsyncgethostname 取得 local 主機名稱
WSAAsyncGetprotobyname 以通訊協定的名稱取得通訊協定的相關資訊WSAAsyncGetprotobynumber 以通訊協定的號碼取得通訊協定的相關資訊
WSAAsyncGetservbyname 以服務的名稱取得服務的相關資訊WSAAsyncGetservbyport 以服務的通訊埠及通訊協定取得服務的相關資訊
Microsoft Windows Socket (續 )
• Winsock 在網路應用程式開發上 , 一樣可以分成 :– Stream Socket (Connection-Oriented Protoc
ol)– Datagram Socket (connectionless Protocol)
Microsoft Windows Socket (續 )
• Winsock Stream Socket Client/Server
WSAStartup
Bind
Listen
WSAAccept
WSACleanup
WSARecv / WSASend
WSASend / WSARecv
Connect()
WSACleanup
WSAStartup
Server Client
Microsoft Windows Socket (續 )
• Winsock Datagram Socket
WSAStartup
Bind
WSACleanup
WSASendto
WSARecvfrom
JAVA Socket• Java 最初設計的目的有下列考量 :
– 與 OS 及 Platform無關的程式語言•跨平台 (Cross Platform)
– 物件導向 (Object Oriented)– 增強WWW 與使用者互動的模式– 支援 Internet Programming– …
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)
JAVA Socket (續 )• 以 Java.net而言 ,其 API 可以分成以下幾類 :– 處理 URL– 處理主機名稱及 IP Address– 處理 TCP 與 UDP 通訊協定– 處理網路認證 (Authentication) 與權限 (pe
rmission)– 內容處理器 (ContentHandler)
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
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
JAVA Socket (續 )• 處理 UDP 通訊協定
– Interface• DatagramSocketImplFactory
– Class• Java.net.DatagramPacket• Java.net.DatagramSocket• Java.net.DatagramSocketImpl• Java.net.MulticastSocket
– Exception• Java.net.SocketException
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
JAVA Socket (續 )•處理網路認證 (Authentication) 與權限
(permission)– Class
• Java.net.Authenticator• Java.net.NetPermission• Java.net.PasswordAuthentication• Java.net.SocketPermission• Java.net.SocketException
JAVA Socket (續 )•內容處理器 (ContentHandler)
– Interface• ContentHandlerFactory
– Class• Java.net.ContentHandler• Java.net.SocketException
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 端連結
JAVA Socket (續 )
ServerSocket
Accept
Close
read / send
send / read
Socket
Close
Server Client
• Java Stream Socket
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
JAVA Socket (續 )• Java Datagram Socket
DatagramSocket
DatagramPacket
Close
send
receive
Server 端 Socket 程式架構
步驟• 建立 Server 端的 socket, 並且等候 Client
端的連結請求•當 Server 端偵測到 Client 端的連結請求
時 ,則接受並藉此建立 Client 端之 socket•處理來自 Client 端的資訊 (Request)•回應給 Client 端 (Response)• 連線結束後關閉 socket
Client Server
請求 (Request)
回應 (Response)
建立 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
建立 Server 端 socket ( 續 )
•參數介紹 :– Port: 指定通訊端通訊埠 , 可為 1~65535未被使用的號碼 ,若使用已使用的號碼 , 會產生 IOException錯誤 ,若設為 0,則會由 ServerSocket 自動尋找未被使用的號碼 .
– Backlog: 表示最大可以連結的 Client 數 ,預設值是 50.
– bindAddr: 如果主機有一個以上的 IP,才需要用這個參數來指定要 bind 的 IP 位址 , 格式為 InetAddress形式 .
建立 Server 端 socket ( 續 )
• 建立 Server 端 socket 的程式架構大致如下 :
Void startServer() { ServerSocket serverSocket; int port = <Port Number>; try { serverSocket = new ServerSocket(port); … } catch (IOException ex) { … }}
取得 Server 端 Socket 資訊
• Server 端 socket 以 ServerSocket 建立之後 , 可以使用以下方法取得 Server 端socket 的相關資訊 :– Public InetAddress GetInetAddress()– Public int getLocalPort()
•回傳所使用的通訊埠號
取得 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”
取得 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());}
取得 Server 端 Socket 資訊 ( 續 )
範例實作 : 請利用前述的方法試寫出一個小程式可以擷取本身電腦的 IP, host name 資訊 .
接受 Client 端連結• 以 ServerSocket 建立 Server 端的 socket 之
後 , 基本上 Server 的雛型已經具備了 , 接著便是等候及接受來自 Client 端的連線 .
• 處理 Client 端連線 , 可以使用 ServerSocket類別的 accept 方法 :– Public Socket accept() throws IOException
接受 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) { … }}}
接受 Client 端連結 ( 續 )• 在建立 Client 端 socket物件之後 , 同樣可以使用 getInetAddr
ess 來取得所連結 Client 端的 IP adress• 設計一個 Server 程式可以等候 Client 連線 , 並顯示 Client 的 I
P
接收與傳送— Server 端• 當 Server 端以 accept 方法建立 Client 端 soc
ket物件之後 ,便可以使用 socket物件所提供的方法傳送與接收來自 Client 端的資料
– Public InputStream getInputStream() throws IOException
– Public OutputStream getOutputStream() throws IOException
接收與傳送— 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(); …}
接收與傳送— 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>); …}
關閉連結— Server 端• 用 ServerSocket 類別的 close 方法關閉 Ser
ver 端 socket 並釋放資源– Public void close() throws IOException
• Client 端也要作喔…
• 看範例…
Client 端 Socket 程式架構
步驟• 建立 Client 端 Socket,再建立時需指定欲連結
Server 端的主機名稱 ( 或 IP) 與 Internet 服務的 port
• 傳送特定資訊或指令至 Server 端• 接收 Server 端回傳的執行結果或錯誤訊息• 當 Client 端不需 Server 端的處理時 ,便關閉
Socket 通訊連結– 此外 ,Clinet 端程式常為一般使用者所使用 ,因此 ,
使用者介面 (user interface) 也要好好設計 .
建立 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
建立 Client 端 Socket( 續 )• 參數說明 :
– Address: 設定 Server 端 IP, 為 InetAddress形式– Port: 設定 Server 端所提供之 Internet 服務埠– LocalAddr: 若 Client 有一個以上的 IP,則利用此方
法指定由哪一個 IP 和 Server 連線– LocalPort: 指定 Client 端以哪個 port 與 Server 相
連– Host: 除了可以指定 Server 主機 IP,亦可利用此方
法指定 Server 主機名稱 , 但須配合 DNS 運作 ,否則會產生 UnknownHostException錯誤
建立 Client 端 Socket( 續 )• 程式架構大致如下 :
Socket socket;Int port = <Port Number>;
Try { socket = new Socket(InetAddress.getByName(“<Host Name>”), port); …}
Catch ( IOException ex) { …}
取得 Client 端 Socket 資訊• Client 端 socket除了提供取得 local 端
所使用的 IP 與 Port 之外 , 也提供連結 Server 端資訊的 API:– Public InetAddress getLocalAddress()– Public int getLocalPort()– Public InetAddress getInetAddress()– Public int getLocalPort()
取得 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”
取得 Client 端 Socket 資訊( 續 )
• getLocalPort: 回傳 Client 端 socket 所使用的埠號
• getInetAddress 與 getPort 的用法則與 Server 端所使用的相同 .
– 看範例…
傳送與接收— Client 端• 和前述 Server 端的做法相同
– 傳出為” write”– 接收為” read”
關閉連結— Client 端• 和 Server 端一樣
– Public void close() throws IOException• 看範例…