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

Similar documents
投影片 1


Microsoft Word - 投影片ch22

Chap6.ppt

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

第 1 章 概 述 1.1 计 算 机 网 络 在 信 息 时 代 中 的 作 用 1.2 计 算 机 网 络 的 发 展 过 程 *1.2.1 分 组 交 换 的 产 生 *1.2.2 因 特 网 时 代 *1.2.3 关 于 因 特 网 的 标 准 化 工 作 计 算 机 网 络 在

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC

Microsoft PowerPoint - 数据通信-ch1.ppt

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

<4D F736F F F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>

Chapter #

untitled

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

C6_ppt.PDF


主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

ebook140-11

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


TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

ebook

ebook12-1

工程师培训

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

第3章 计算机网络体系结构

/ / (FC 3)...

Simulator By SunLingxi 2003

雲端 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

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

Microsoft PowerPoint - Socket programming.ppt [相容模式]

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

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

封面-12

版权声明


ebook

穨control.PDF

資料結構之C語言重點複習

Microsoft Word - CH06.doc

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Data Server_new_.doc

ebook140-8

宏电文档

JavaIO.PDF

The golden pins of the PCI card can be oxidized after months or years

ebook67-1

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

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

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

導讀 ASP.NET HTML ASP 第一篇 基礎篇第 1 章 認識 ASP.NET ASP.NET ASP.NET ASP.NET ASP.NET 第 2 章 認識 Visual Studio 20 開發環境 Visual Studio 20 Visual Studio 20 第二篇 C# 程式

SSL 數位憑證 OpenVPN 安裝說明

计算机网络

2016 勒索軟體白皮書

投影片 1

財金資訊-80期.indd

書面

lan03_yen

Outlook 2010 設定說明 Offic 企業郵件 / 虛擬主機郵件 / Office 365

C3_ppt.PDF

叮当旺业通

穨CAS1042快速安速說明.doc

電機工程系認可證照清單 /7/1

穨CAS1042中文手冊.doc

Microsoft Word - 投影片ch14

Outlook 2007 設定說明 Offic 企業郵件 / 虛擬主機郵件 / Office 365

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub

飞鱼星多WAN防火墙路由器用户手册

深入理解otter

1

Microsoft Word - 46.doc

ebook140-9

1.5招募说明书(草案)

(Real-time) (Local Host) (Buffer) (Video Conference) (VoD) (NetRadio) ,000 [1]( ) ( ) 1400 (2001 ) 75 (2005 ) DFC Intelligence [2] 1

Microsoft Word - YDB Vehicle Telematics Service Requirement and General Framework

关于建立境内违法互联网站黑名单管理制度的通知

<4D F736F F D20D0C5CFA2BBAFB7A2D5B9D6D8B5E3D7A8CFEEB9E6BBAE2E646F63>

? 這 全 都 是 市 政 府 提 供 給 我 的 資 料 低 底 盤 公 車 計 畫 96 年 預 算 新 台 幣 4,500 萬 元 97 年 預 算 新 台 幣 1 億 6,500 萬 元 98 年 預 算 新 台 幣 3 億 2,300 萬 元, 共 有 307 台 低 底 盤 公 車,99

untitled

ebook67-10

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

Photoshop CS3 影像創造力 基礎講堂 8 學習流程 學習重要性 學習難度 必學指令工具 實作應用範例 創造舞台燈光的漸層繪圖 延伸學習 雜訊與半透明漸層 8-1 Photoshop Photoshop 8 136

ebook67-9

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

9 Internet 10 Internet

ebook12-11

90 1 2/3 2/

...1 What?...2 Why?...3 How? ( ) IEEE / 23

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

经华名家讲堂

计算机网络

A API Application Programming Interface 见 应 用 程 序 编 程 接 口 ARP Address Resolution Protocol 地 址 解 析 协 议 为 IP 地 址 到 对 应 的 硬 件 地 址 之 间 提 供 动 态 映 射 阿 里 云 内

8月31日 高松市震災対策総合訓練が古高松中学校において実施され,住民2000人が参加した

提问袁小兵:

ebook2-1

認識動態主機設定協定(DHCP)

AutoCAD 用戶如何使用 ArchiCAD

DaoCiDi2003TC ct-P293L02-R

第 11 章 互聯網技術 11.1 互聯 網 和 萬 維 網 的 發 展 歷 史 A. 互聯網的發展 互聯網是由 ARPANET 開 始發展的 1969 年 美國國防部高級研究計劃署 (ARPA) 把部分軍事研究所和大 的電腦連接起來 建造了㆒個實驗性的電腦網絡 稱為 ARPANET 並 列 的功能

Web

Transcription:

第五章 Java Socket 連線的建立 < 學習目標 > 學會使用 Java 實作基本的 Socket 連線並傳送訊息

5-1 認識 Socket 所有的網路應用程式, 都是以 Socket 為基礎, 它的功能是在兩台電腦之間建立網路連線, 並能夠傳送與接收資料 Socket 指的是兩個程序 (process) 透過網路溝通的端點, 要建立 Socket 連線, 一般來說需要兩個資訊, 一個是 IP, 另一個是通訊埠 (port) Socket 連線建立之後, 便能夠利用這個連線傳送與接收資料, 如圖 5-1 所示 Client Server Client Process Socket Server Process Socket TCP/IP TCP/IP Internet 圖 5-1 Socket 連線示意圖以 Java 來設計網路程式並不用寫太多程式, 只要兩台電腦能夠辨識彼此的 IP 位址, 並且兩台電腦上皆安裝了 JVM, 即可使用 Java 來實現網路應用程式 5-2 建立 Socket 連線在本節中, 將說明最基本的建立 Socket 連線之程式, 為了證明確實有連線成功, 會將連線的來源位址 (IP address) 印出 5-2-1 Server 端程式實作在此, 將介紹基本伺服端的程式範例 ( 程式 5-1), 伺服端程式必須使用 ServerSocket 類別, 執行此類別的電腦會成為伺服器的角色 伺服端的程式執行之後, 就會等待用戶端的連線, 而用戶端進行連線後, 伺服端會將連線進來之用戶端的 IP 位址印出

程式 5-1 (Ch5\Ch5_1Server.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 07: 建立類別 ServerSocket 型態之物件 server,port 為 1357 09-10: 在物件 server 執行 accept() 方法, 接受用戶端的連線請求, 並建立類別 Socket 型態之物件 s1 10: 取得用戶端之 IP address 並印出 11: 關閉連線 13: 列印錯誤訊息表 5-1 列出了一些 ServerSocket 類別中, 能夠取得或設定伺服端物件狀態的方法, 它們大都以 get 或 set 開頭 語法 public SocketChannel getchannel() public InetAddress getinetaddress() public int getlocalport() public SocketAddress getlocalsocketaddress() public int getreceivebuffersize() throws public void setreceivebuffersize(int size) throws public boolean getreuseaddress() throws public void setreuseaddress(boolean on) throws public int getsotimeout() throws 說明傳回連線所使用的 SocketChannel 傳回連線之本地端網路位址傳回連線之 port number 傳回連結的本地端位址並做為 SocketAddress 之物件可取得或設定伺服端使用的緩衝區大小, 預設值為 64KB 可取得或設定是否有啟用重覆使用同一位址之功能 連線中斷後的短時間內有可能無法完全釋放資訊而造成無法要求新連線, 若將此狀態設為 true 即可避免這個問題可取得或設定執行 accept() 方法的逾時時間, 單位為毫秒 (ms), 預設

public void setsotimeout(int timeout) 值為 0, 代表不會逾時, 永遠等待 throws public void setperformancepreferences(int 可設定連線時間 等待時間以及頻 connectiontime, int latency, int bandwidth) 寬的重要性, 最重要者設為 3, 最不重要者設為 1, 這個設定會影響 JVM 內部的優先處理順序表 5-1 ServerSocket 類別中的方法 5-2-2 Client 端程式實作在此, 將介紹基本用戶端的程式範例 ( 程式 5-2), 用戶端程式必須使用 Socket 類別, 並且需要指定伺服器的 IP 位址以及 port number, 即可建立要求連線的用戶端 程式 5-2 (Ch5\Ch5_1Client.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 07: 建立類別 Socket 型態之物件 c1, 並傳入伺服器 IP 以及 port number 1357 08: 關閉連線 10: 列印錯誤訊息將程式 5-1 與程式 5-2 分別編譯完成後, 可將此兩個程式放在兩台電腦上執行, 由於程式 5-2 中需要設定伺服器的 IP address, 因此請讀者在編譯之前, 將範例程式中的 IP 位址改為實際測試之電腦 IP 位址 程式 5-1( 伺服端程式 ) 執行後的結果如圖 5-2 所示, 會持續等待用戶端來進行連線 圖 5-2 程式 5-1 之執行結果

執行了程式 5-1 後, 接下來可在另外一台電腦上執行程式 5-2( 用戶端程式 ), 用以和伺服端進行連線, 在程式 5-2 執行後, 程式 5-1 就會印出連線用戶端的 IP address, 在這邊的例子為 140.116.239.139, 如圖 5-3 所示 圖 5-3 程式 5-1 在用戶端連線後之執行結果 表 5-2 列出了一些 Socket 類別中, 能夠取得或設定連線狀態的方法, 它們大 都以 get 或 set 開頭 語法 public SocketChannel getchannel() public InetAddress getinetaddress() public InetAddress getlocaladdress() public int getport() public int getlocalport() public SocketAddress getremotesocketaddress() public SocketAddress getlocalsocketaddress() public int getsendbuffersize() throws public void setsendbuffersize(int size) throws public int getreceivebuffersize() throws public void setreceivebuffersize(int size) throws public boolean getreuseaddress() throws public void setreuseaddress(boolean on) throws 說明傳回連線所使用的 SocketChannel 傳回連線之伺服端網路位址傳回連線之本地端網路位址傳回連線之伺服端 port number 傳回連線之本地端 port number 傳回連線的伺服端位址並做為 SocketAddress 傳回連線的本地端位址並做為 SocketAddress 可取得或設定傳送資料使用的緩衝區大小可取得或設定接收資料使用的緩衝區大小可取得或設定是否有啟用重覆使用同一位址之功能 連線中斷後的短時間內有可能無法完全釋放資訊而造成無法要求新連線, 若將此狀態設為 true 即可避免這個問題

public int getsotimeout() throws 可取得或設定執行 accept() 方法的 逾時時間, 單位為毫秒 (ms), 預設 public void setsotimeout(int timeout) 值為 0, 代表不會逾時, 永遠等待 throws public boolean gettcpnodelay()throws 可取得或設定 TCP_NODELAY 之 值, 表示是否要啟用 Nagle 演算 public void settcpnodelay(boolean on) 法, 可參閱 RFC 896 [1] 文件 throws public int getsolinger() throws 可取得或設定斷線後的處理時 間, 在斷線之後, 再依此時間將尚 public void setsolinger(boolean on, int 未處理完的資料處理完, 若設為 linger) throws 0, 則未處理完的資料會被丟棄 public boolean getkeepalive()throws 可取得或設定 SO_KEEPALIVE 之 值, 表示連線是否正在使用中, 若 public void setkeepalive(boolean on) throws 是長期閒置且此值為 true 時, 會發 送封包至伺服器確認對方還在 public int gettrafficclass() throws 可取得或設定封包標頭中的流量 類別 (Traffic Class) 或是服務類型 public void settrafficclass (int tc) throws 八位元組 (Type-of-service octet), 可參閱 RFC 1122 [2] 文件 表 5-2 Socket 類別中的方法 5-3 TCP Socket 連線與資料傳輸 TCP (Transmission Control Protocol) 是屬於連線導向 (connection-oriented) 的協定, 也就是說伺服端與用戶端需要先行建立連線之後, 才能夠進行資料的傳輸 在 5-2 節中已經說明了伺服端與用戶端之間的連線如何建立, 在本節中, 將就 5-2 節中所介紹的程式再加以擴充, 使伺服端與用戶端之間可以互傳訊息或資料 本節所提供的範例程式, 在伺服端與用戶端建立連線後, 使用者可在用戶端程式輸入文字, 用戶端程式便會將字串傳送至伺服端並列印出來 5-3-1 Server 端程式實作程式 5-1 已經介紹了基本的伺服端的實作, 在此要將程式 5-1 擴充成具有接收用戶端所傳送之訊息的能力, 程式 5-3 是基於程式 5-1, 再加上 I/O 的動作, 即可完成訊息的傳送 程式 5-3 之 7~10 行, 和程式 5-1 相同, 而 I/O 的動作是在第 12~14 行處, 將接收到的訊息串流列印出來

程式 5-3 (Ch5\Ch5_2Server.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 12: 在物件 s1 執行 getinputstream 方法, 取得輸入之串流, 並建立類別 DataInputStream 型態之物件 din1, 將輸入串流轉換為物件 din1 13: 將讀取到的資料存至字串 tmp 14: 將字串 tmp 印出 15: 關閉連線 19: 列印錯誤訊息 5-3-2 Client 端程式實作程式 5-2 介紹了基本用戶端的實作, 在此將程式 5-2 擴充成具有傳送訊息至伺服端的能力 ( 程式 5-4) 要將資料自 Socket 傳出, 其實與檔案寫入的動作相當類似, 要將資料寫入檔案, 第一步要先開啟檔案, 接下來寫入檔案, 最後將檔案關閉,Socket 也是類似, 要將資料寫至 Socket, 首先要建立 Socket 連線, 接下來將資料寫入 Socket, 最後將連線關閉

程式 5-4 (Ch5\Ch5_2Client.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 09: 將 System.in 轉換為 InputStreamReader 型態之物件, 再將此物件轉換成 BufferedReader 型態之物件 in 10: 在物件 c1 執行 getoutputstream 方法, 取得輸出之串流, 並建立類別 DataOutputStream 型態之物件 out, 將輸出串流轉換為物件 out 13: 將自鍵盤讀到的資料存到字串 tmp 14: 將字串 tmp 寫入輸出串流 16: 關閉連線 18: 列印錯誤訊息與 5-2 節中介紹的相同, 將此兩支程式碼編譯過後, 可將.class 檔案放至兩台不同的電腦上執行 執行了程式 5-3 以及程式 5-4 後, 伺服端的畫面如圖 5-4 所示, 表示已經有一個 IP address 為 140.116.239.139 的用戶端進行連線 圖 5-4 程式 5-3 接受用戶端連線後的畫面 接下來在用戶端可以輸入欲傳送的訊息, 如圖 5-5 所示, 輸入訊息 hello 之後送出, 用戶端程式就算隨之結束, 當然連線也會關閉 圖 5-5 程式 5-4 的執行畫面 : 傳送訊息 hello 至伺服端 用戶端傳送了訊息之後, 可發現伺服端的確印出了用戶端所傳送的訊息 hello, 如圖 5-6 所示

圖 5-6 伺服端收到訊息 hello 並印出 5-4 UDP Socket 資料之傳輸 UDP (User Datagram Protocol) 是一個非連線型 (connectionless) 的 protocol, 用戶端與伺服端並不需要先建立連線, 就可以進行資料的傳輸, 只要知道資料傳送的目的地以及 port number, 就可以將資料送出 由於沒有先確認連線的建立, 無法確保目的地是否正常地運行以及是否能夠成功地接收資料, 因此 UDP 協定並不保證資料傳輸的成功與否 5-4-1 Server 端程式實作由於 UDP 協定不需要先建立連線, 因此不需要使用程式 5-1 中的 ServerSocket 類別, 不論是伺服端或是用戶端, 使用的都是 DatagramSocket 類別 程式 5-5 是伺服端的範例程式, 執行後便等待資料的傳入

程式 5-5 (Ch5\Ch5_3Server.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 09: 建立一個 DatagramSocket 類別的物件 server,port number 為 1357 11: 宣告一個大小為 20bytes 的緩衝區 18: 建立一個 DatagramPacket 類別的物件 request,datagrampacket 類別中包含了一些用來建立封包物件的建構子 19: 在 server 物件執行 receive 方法, 接收封包資料 20: 在 request 物件執行 getdata 方法, 取出資料並轉換為字串型態並印出 26 29: 列印錯誤訊息 31-34:finally 區塊, 判斷 server 物件是否為 null, 若不為 null, 則關閉連線 這個動作可以確保在程式結束前, 連線一定會被關閉 5-4-2 Client 端程式實作實作 UDP 協定時, 用戶端也不需要使用到 Socket 類別, 和伺服端相同使用 DatagramSocket 類別即可 程式 5-6 是用戶端的範例程式, 程式執行後會等待使用者由鍵盤輸入資料, 並將資料傳送至伺服端 程式 5-6 (Ch5\Ch5_3Client.java) 01: 匯入 java.io 套件 02: 匯入 java.net 套件 09: 建立一個 DatagramSocket 類別的物件 client 12-15: 由鍵盤讀入資料, 並存至變數 inputstr 中

17: 建立一個 DatagramPacket 類別的物件 request, 傳入的參數包含了 : 欲傳送的資料 資料的長度 伺服端 IP 位址以及 port number 19: 在 client 物件執行 send 方法, 傳送封包資料 22 25: 列印錯誤訊息 27-30:finally 區塊, 判斷 client 物件是否為 null, 若不為 null, 則關閉連線 同樣地將這兩個程式編譯後, 分別放到兩台電腦上執行, 當伺服端程式執行後, 就開始等待資料的傳入, 如圖 5-7 所示 此時只要有任何一個 UDP Client 傳送資料至伺服器 IP 位址的特定 port ( 在此為 1357), 伺服端程式就能夠收到資料並將資料印出 圖 5-7 伺服端程式等待訊息傳入 用戶端的程式執行後, 會等待使用者輸入資料, 並將資料傳送至伺服端, 在 資料送出之後, 程式會隨即結束, 如圖 5-8 所示 圖 5-8 用戶端程式伺服端程式接收到由用戶端傳來的訊息以後, 會將訊息印出, 如圖 5-9 所示 伺服端程式仍會繼續等待資料的傳入, 若是有其它的用戶端也將資料傳至此伺服器, 同樣也會將該資料印出 圖 5-9 伺服端程式接收訊息並印出

參考資料 [1] RFC 896 http://tools.ietf.org/rfc/rfc896.txt [2] RFC 1122 http://www.ietf.org/rfc/rfc1123.txt 課後練習 1. 要和另一台機器建立 Socket 連線, 需要那兩種資訊? 2. 請修改程式 5-3 與程式 5-4, 使得伺服端在收到用戶端傳來的資訊後, 再回傳一句 Data Received. 給用戶端, 才關閉連線 當然, 用戶端也需要將此訊息印出