Microsoft PowerPoint - CH06.ppt [相容模式]

Similar documents
Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

JavaIO.PDF

Microsoft Word - 投影片ch22

Microsoft PowerPoint - CH05.ppt [相容模式]

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

chp6.ppt

EJB-Programming-4-cn.doc

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

EJB-Programming-3.PDF

Java

Microsoft Word - Java Socket 連線的建立課程_柯志亨老師_電子書.doc

untitled

Chapter 9: Objects and Classes

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

CC213

untitled

Microsoft Word - ch04三校.doc

Chapter 9: Objects and Classes

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

untitled

《计算概论》课程 第十九讲 C 程序设计语言应用

Microsoft Word - 01.DOC

Microsoft Word - JAVA Programming Language Homework VI_ans.doc

untitled

投影片 1

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

untitled


Microsoft PowerPoint - 17_JavaSocketProgramming.ppt

OOP with Java 通知 Project 6: 5 月 30 日晚 9 点

OOP with Java 通知 Project 6: 6 月 6 日晚 9 点

计 算 机 系 统 应 用 年 第 25 卷 第 4 期 线 程 的 复 用 [2,3]. 通 常 情 况 下, 服 务 器 端 程 序 在 启 动 时 创 建 若 干 数 量 的 线 程 对 象 并 缓 存 起 来, 此 时 它 们 处 于

untitled

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

View:Struts 提 供 了 action form 创 建 form bean, 用 于 在 controller 和 view 间 传 输 数 据 此 外,Struts 提 供 了 自 定 义 JSP 标 签 库, 辅 助 开 发 者 用 JSP 创 建 交 互 式 的 以 表 单 为 基

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

附录J:Eclipse教程

2009年9月全国计算机等级考试二级Java真题及答案

CC213

FileMaker 16 ODBC 和 JDBC 指南

Data Server_new_.doc

Java 1 Java String Date

Learning Java

Microsoft PowerPoint - L17_Inheritance_v4.pptx

提问袁小兵:

D C 93 2

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Bus Hound 5

OOP with Java 通知 Project 6: 5 月 24 日晚 9 点

AL-M200 Series

/ / (FC 3)...

使用MapReduce读取XML文件

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

FileMaker 15 ODBC 和 JDBC 指南

《大话设计模式》第一章

Chapter #

3.1 num = 3 ch = 'C' 2

untitled

K301Q-D VRT中英文说明书141009

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

Microsoft Word - Learn Objective-C.doc

RUN_PC連載_12_.doc

穨control.PDF

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v

untitled

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

Microsoft Word - 投影片ch14

Microsoft PowerPoint - CH01.ppt

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

untitled

<4D F736F F D20BAF4BADEA457BDD2B1D0A7F75F4A415641B57BA6A1B2D52E646F63>

C/C++语言 - C/C++数据

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难


北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

无类继承.key

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

叮当旺业通

import java.util.*; 在 Java 中 的 简 单 的 TCP 服 务 器 在 Java 中, 一 个 服 务 器 端 的 被 动 的 套 接 字 由 java.net.serversocket 表 示. 一 个 TCP 服 务 器 构 造 一 个 java.net.s

第1章 簡介

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

epub83-1

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

從詩歌的鑒賞談生命價值的建構

mvc

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

2 奋 斗 的 历 程 丰 硕 的 成 果 ( 二 ) 化 进 程 图 l 清 华 大 学 综 合 教 务 系 统 数 据 管 理 流 程 二 教 务 系 统 的 一 级 管 理 模 式 教 务 系 统 配 合 学 校 体 制 改 革, 将 二 级 教 务 管 理 变 为 一 级 管 理 模 式 减

Microsoft PowerPoint - EmbSys101_Java Basics.ppt [相容模式]

Transcription:

第六章伺服器 課前指引本章介紹如何以 Java 語言設計出伺服器應用程式, 學習利用 ServerSoc ket 類別設計 TCP 伺服器, 並取得輸出入資料流後傳遞資料到用戶端 第一部份除介紹 TCP 伺服器外, 亦以 偵測本機被占用的埠號 報時伺服器 與 回音伺服器 等實作範例, 讓讀者能更瞭解伺服器程式設計的方法 UDP 是本章的第二項重點, 學習如何送出 UDP 封包, 並實際設計可接收 UDP 封包並解讀封包內容的伺服器,UDP 協定則是以偵測特定主機是否還正常運作的的範例程式, 加強讀者對其應用的印象 章節大綱 前言 6-1 ServerSocket 類別 備註 : 可依進度點選小節 1

前言 Client/Server 模式 Server 代表伺服端應用程式網頁服務 (HTTP) BBS(TELNET) 3 前言 Client/Server 模式 銀行總行與分行間 4 2

6-1 ServerSocket 類別 使用建構子 ServerSocket() 即可產生物件綁定一個傾聽埠號, 即可讓程式固定傾聽主機上的埠號 java.net.socket 支援用戶端 TCP 網路應用程式 java.net.serversocket 支援伺服器端 TCP 網路應用程式, 僅支援阻斷 (Blocking) 模式 Blocking Mode: 伺服器接受某一個使用者連線後, 下一個用戶端必須等此使用者結束連線, 方能再產生連線 無法達到多人連線目的解決方式 : 伺服器為每一個連線使用者, 各自建立一個執行緒 Non-Blocking Mode 5 6-1 ServerSocket 類別 ServerSocket 類別有四種建構子 執行建構子或方法時, 出現埠號被占用或輸出入錯誤等例外情形 BindException IOException 6 3

6-1 ServerSocket 類別 建構子 public ServerSocket(): 無需參數即建立 ServerSocket 物件的建構子 public ServerSocket(int port): 建立物件時直接指定傾聽埠號 public ServerSocket(int port, int queuelength): 建立物件時直接指定傾聽埠號, 並設定等待駐列數 public ServerSocket(int port, int queuelength, InetAddress bindaddress): 此建構子除了建立物件時直接指定傾聽埠號與等待駐列個數外, 若主機擁有多個 IP 位址 ( 多張網路卡 ) 時, 可指定傾聽的 IP 位址 7 6-1 ServerSocket 類別 方法 public void bind(socketaddress ep): 指定傾聽埠號 public int getlocalport(): 取得 ServerSocket 物件所指定的埠號值, 傳回整數值 public InetAddress getinetaddress(): 取得 ServerSocket 物件所綁定的 IP 位址 Socket accept(): 開始依照所指定的埠號進行傾聽 public ServerSocketChannel getchannel(): 在 非停頓 (non-blocking) 模式之下使用 public void close(): 關閉 ServerSocket 物件, 釋放傾聽的埠號的資源占用 8 4

6-1 ServerSocket 類別 伺服器的輸出入串流 使用 accept() 方法時, 會停頓等待客戶端連線 當客戶端連線後該方法會回傳一 Socket 物件 利用 Socket 物件的 getinputstream 與 getoutputstream 方法得到輸入與輸出資料流物件 ServerSocket ss = new ServerSocket(8888); Socket socket = ss.accept(); // 連線後, 取得輸出入串流 OutputStream out = socket.getoutputstream(); InputStream in = socket.getinputstream(); 9 設計伺服器應用程式時, 要考量到幾個要點 : 支援多客戶端連線連線等待負荷多執行緒伺服器資源負荷 10 5

偵測本機被佔用的埠號 -PortScanner 01 package com.ch06; 02 03 import java.io.ioexception; 04 import java.net.serversocket; 05 06 public class PortScanner { 07 public void scan(){ 08 for (int i=1; i< 65535; i++){ 09 try { 10 ServerSocket ss = new ServerSocket(i); 11 } catch (IOException e) { 12 System.out.println("port "+ i+ " 被占用中 "); 13 } 14 } 15 } 16 17 public static void main(string[] args) { 18 PortScanner pserver = new PortScanner(); 19 pserver.scan(); 20 } 21 } 11 偵測本機被佔用的埠號 -PortScanner 執行結果 port 21 被占用中 port 80 被占用中 port 135 被占用中 port 445 被占用中 port 554 被占用中 12 6

報時伺服器 -TimeServer 01 package com.ch06; 02 03 import java.io.ioexception; 04 import java.io.printwriter; 05 import java.net.serversocket; 06 import java.net.socket; 07 import java.util.calendar; 08 import java.util.date; 09 10 public class TimeServer { 11 public TimeServer() { 12 } 13 14 public void report() { 15 try { 16 ServerSocket ss = new ServerSocket(8886); 17 Date date = Calendar.getInstance().getTime(); 18 Socket socket = ss.accept(); 13 報時伺服器 -TimeServer 19 PrintWriter out = new PrintWriter( 20 socket.getoutputstream()); 21 out.println(date); 22 out.flush(); 23 out.close(); 24 socket.close(); 25 ss.close(); 26 } catch (IOException e) { 27 System.out.println(" 輸出入錯誤 "); 28 } 29 } 30 31 public static void main(string[] args) { 32 TimeServer tserver = new TimeServer(); 33 tserver.report(); 34 } 35 } 14 7

報時伺服器 -TimeServer 執行此程式後, 可使用 Windows 系統內建的 telnet 程式連線至 localhost 的 8886 埠號測試 : C:\> telnet localhost 8886 Thu Apr 15 01:29:11 CST 2010 伺服器傳來的字串 遺失與主機的連線 C:\> 15 The Calendar class is an abstract class that provides methods for converting between a specific instant in time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on, and for manipulating the calendar fields, such as getting the date of the next week. public static Calendar getinstance(): Gets a calendar using the default time zone and locale. The Calendar returned is based on the current time in the default time zone with the default locale. Returns: a Calendar public final Date gettime(): Returns a Date object representing this Calendar's time value (millisecond offset from the Epoch"). Returns: a Date representing the time value 16 8

PrintWriter PrintWriter: Prints formatted representations of objects to a textoutput stream. print: print(boolean b); print(char c);. println public PrintWriter (OutputStream out): Creates a new PrintWriter, without automatic line flushing, from an existing OutputStream. This convenience constructor creates the necessary intermediate OutputStreamWriter, which will convert characters into bytes using the default character encoding. public void print(object obj): Prints an object. The string produced by the String.valueOf(Object) method is translated into bytes according to the platform's default character encoding, and these bytes are written in exactly the manner of the write(int) method. 17 PrintWriter public void flush(): Flushes the stream. Any buffered output is written to the stream. 舉凡使用 java 做 io 時, 必須要使用 flush() 才能將資料輸出到輸出裝置輸出裝置可能是 : 螢幕或檔案等. Example: 十秒後才會看到檔案的內容 import java.io.*; import java.util.*; public class Test_IO{ public static void main(string args[]){ try{ String content= Today is a good day. ; FileWriter fo = new FileWriter( sample.txt ); fo.write(content); long curr = System.currentTimeMillis(); 18 9

PrintWriter while(true){ long result = System.currentTimeMillis()-curr; if(result/10000 == 1){ //10 秒後 flush fo.flush(); System.out.println( Flushed! ); break; }/* end of while */ } fo.close(); }catch(exception e){ e.printstacktrace(); } }//end main }//end class 19 PrintWriter 你或許會問, 常常用的 System.out.println() 也是個 io 輸出為什麼不用打 System.out.flush(), 就可以直接看到結果? 這是因為有些 io 類可以設定 auto flush( 自動 ) System 的 out 是個 PrintStrem 物件, api 說明中有寫道 : Optionally, a PrintStream can be created so as to flush automatically; this means that the flush method is automatically invoked after a byte array is written, one of the println methods is invoked, or a newline character or byte ( \n ) is written. Unlike the PrintStream class, if automatic flushing is enabled it will be done only when one of the println, printf, or format methods is invoked, rather than whenever a newline character happens to be output. 所以上完廁所, 如果沒有自動沖水裝置, 別忘了要自己手動沖水 (flush!) 20 10

回音伺服器 -EchoServer 01 package com.ch06; 02 03 import java.io.*; 04 import java.net.serversocket; 05 import java.net.socket; 06 07 public class EchoServer { 08 public void echo() { 09 try { 10 ServerSocket ss = new ServerSocket(8885); 11 Socket socket = ss.accept(); 12 // 連線後, 取得輸出入串流 13 OutputStream rawout = socket.getoutputstream(); 14 InputStream rawin = socket.getinputstream(); 15 PrintWriter out = new PrintWriter(rawOut); 16 BufferedReader in = new BufferedReader( 17 new InputStreamReader(rawIn)); 18 // 等待客戶端送來字串 21 回音伺服器 -EchoServer 19 String data = in.readline(); 20 System.out.println(" 收到 :" + data); 21 // 將傳來的資料回送給客戶端 22 out.println(data); 23 out.flush(); 24 System.out.println(" 送出 :" + data); 25 // 關閉連線資源 26 in.close(); 27 out.close(); 28 socket.close(); 29 ss.close(); 30 } catch (IOException e) { 31 System.out.println(" 輸出入錯誤 "); 32 } 33 } 34 35 public static void main(string[] args) { 22 11

回音伺服器 -EchoServer 36 EchoServer eserver = new EchoServer(); 37 eserver.echo(); 38 } 39 } 執行此程式後, 可使用 Windows 系統內建的 telnet 程式連線至 localhost 的 8885 埠號測試, 輸入 hello 後按下 Enter 鍵即可得到伺服器回傳回來 : C:\> telnet localhost 8885 Hello 遺失與主機的連線 C:\> EchoServer 執行的結果收到 :hello 送出 :hello 23 計算客戶端連線次數 -CounterServer 01 package com.ch06; 02 03 import java.io.*; 04 import java.net.serversocket; 05 import java.net.socket; 06 07 public class CounterServer { 08 public static int count = 0; 09 10 public void startcount() { 11 while (true) { 12 try { 13 ServerSocket ss = new ServerSocket(8884); 14 Socket socket = ss.accept(); 15 count++; 16 System.out.println(" 第 " + count + " 個客戶連線成功 "); 17 OutputStream rawout = socket.getoutputstream(); 18 PrintWriter out = new PrintWriter(rawOut); 24 12

計算客戶端連線次數 -CounterServer 19 out.println(" 您是第 " + count + " 個客戶端 "); 20 out.flush(); 21 out.close(); 22 socket.close(); 23 ss.close(); 24 } catch (IOException e) { 25 System.out.println(" 輸出入錯誤 "); 26 } 27 } 28 } 29 30 public static 31 CounterServer cserver = new CounterServer(); 32 cserver.startcount(); 33 } 34 } 25 計算客戶端連線次數 -CounterServer 執行 CounterServer 類別後, 可使用 Windows 系統內建的 telnet 程式連線至 localhost 的 8884 埠號測試, 多執行幾次, 可看出持續計次的效果 : C:\> telnet localhost 8884 您是第 1 個客戶端遺失與主機的連線 C:\> telnet localhost 8884 您是第 2 個客戶端遺失與主機的連線 C:\> telnet localhost 8884 您是第 3 個客戶端遺失與主機的連線 C:\> 26 13

DatagramPacket 建立 UDP 封包 定義了 UDP 封包的格式與資訊 對方 ( 伺服端 ) 的 IP 位址埠號欲傳送的資料 27 DatagramPacket 建構子 public DatagramPacket(byte[] data, int length, InetAddress dest, int port) public DatagramPacket(byte[] data, int offset, int length, InetAddress dest, int port) public DatagramPacket(byte[] data, int length, SocketAddress dest) public DatagramPacket(byte[] data, int length, SocketAddress dest) public DatagramPacket(byte[] buffer, int length) Public DatagramPacket(byte[] butter, int offset, int length) 28 14

DatagramPacket DatagramPacket 方法 public byte[] getdata(): 取得 UDP 封包內的資料 public InetAddress getaddress(): 得到 UDP 封包的 IP 位址物件 public int getport(): 得到 UDP 封包的埠號值 public int getlength(): 得到 UDP 封包的資料長度 public void setdata(byte[] data): 設定封包內的資料, 傳入一個位元組陣列 public void setaddress(inetaddress addr): 設定封包內的位址, 傳入一個位址物件 public void setport(int port): 設定封包內的埠號值, 傳入一整數 public void setlength(int length): 定封包的資料個數 ( 長度 ), 傳入一個整數 29 DatagramSocket 傳送 UDP 封包接收時, 需要占用一個本機的埠號傳送時, 時不需指令埠號 30 15

DatagramSocket 建構子 DatagramSocket() DatagramSocket(int port) DatagramSocket(int port, InetAddress addr) 31 DatagramSocket DatagramSocket 方法 void connect(inetaddress addr, int port): 依傳入的位址與埠號參數與遠端主機建立連線, 可用來傳送 UDP 封包至特定遠端主機 void disconnect(): 切斷連線 DatagramChannel getchannel(): 得到 NIO 的 UDP 封包頻道 void receive(datagrampacket p): 執行到此方法時會開始等待外來封包到達 void send(datagrampacket p): 依照 p 封包內所事先定義的位址與埠號, 將 p 封包傳送至遠端主機 32 16

UDP Client/Server 範例 送出 UDP 封包 ( 客戶端 )-UDPClient 01 package com.ch06; 02 03 import java.io.ioexception; 04 import java.net.datagrampacket; 05 import java.net.datagramsocket; 06 import java.net.inetaddress; 07 08 public class UDPClient { 09 public static void main(string[] args) throws IOException { 10 InetAddress addr = InetAddress.getLocalHost(); 11 String data = "ABC"; 12 byte[] buf = data.getbytes(); 13 DatagramPacket pkt = new DatagramPacket(buf, buf.length, 14 addr, 9950); 15 DatagramSocket ds = new DatagramSocket(); 16 ds.send(pkt); 17 } 18 } 33 UDP Client/Server 範例 接收 UDP 封包 ( 伺服端 )-UDPServer 01 package com.ch06; 02 03 import java.io.ioexception; 04 import java.net.datagrampacket; 05 import java.net.datagramsocket; 06 07 public class UDPServer { 08 public static void main(string[] args) throws IOException { 09 byte[] buffer = new byte[10]; 10 DatagramPacket pkt = new DatagramPacket(buffer, 10); 11 DatagramSocket ds = new DatagramSocket(9950); 12 System.out.println(" 正在等待埠號 :" + ds.getlocalport()); 13 ds.receive(pkt); 14 System.out.println(" 已收到 UDP 封包, 封包內容 :"); 15 for (int i = 0; i< buffer.length; i++) 16 System.out.print(buffer[i]); 17 } 18 } 34 17

簡易監測協定 1. 伺服端應用程式 ( 被偵測方 ) 假設伺服器的 IP 位址是 192.168.1.10 持續在埠號 9970 等待 ( 接收 ) 外來 UDP 封包收到封包後取得封包內的資料, 檢查資料是否為 AYT 字串, 若符合, 則將一個資料內容為 Everything is fine. 的 UDP 封包送至詢問端電腦位址的埠號 9971 2. 客戶端應用程式 ( 偵測方 ) 主動傳送查詢封包至伺服器 (192.168.1.10) 的埠號 9970, 封包內容是 AYT 等待並接收伺服器的回應封包, 並檢視內容結束程式 35 本章結束 Q&A 討論時間 36 18