【第四章】操作說明
本章將介紹整個系統細節的操作說明,包含如何操作使用者介面,以及 可獲得的結果。
【第五章】結論
本章將對本論文做出總結,提出本系統主要解決了哪些相關問題,還有 本系統架構有哪些優點。
6
由於JAVA的JVM(Java Virtual Machine)技術,可在各種作業系統上建立
7
8
9
2.1.3 JAVA 在網際網路程式開發上的優點
JAVA程式語言提供的許多類別函式庫,可讓開發者針對自己想要設計的程式 加以運用。尤其是網際網路方面的功能,JAVA提供許多有關於網際網路的程式 函式庫供開發者使用,我們時常使用 java.net.* 這個函式庫來開發有關於網際網 路的程式,包含許多類別。其中InetAddress類別常用於獲得網址的各類資訊,而 內部常用的getHostName()及getHostAdress()這兩個方法,分別就能獲得有關於本 機的名稱和位址;另外還有ServerSocket類別,可以它用來開發Server端的伺服器 平台,利用ServerSocket類別的建構函式 ServerSocket(int port),來實作出完整的 伺服器,並且使用accept()方法,即可完成伺服器傾聽的功能;再來則是JAVA程 式語言中,用來開發網際網路程式最為重要的Socket 類別,由於TCP/IP底層的運 作甚為複雜,有許多諸如處理封包、交握等細節,所以JAVA將其直接簡化,只 需要Socket 類別的建構函式 public Socket(InetAddress host, int port),利用連接埠 串起Server端及Client端,將其檔案以資訊串流的方式作傳遞。如此一來,就不用 擔心TCP/IP底層複雜的運作。
10
11
圖2.3 為Client端的流程圖。開啟Client端的程式後,選取欲傳送的資料後,
發出和Server端要求建立連線的訊息,收到Server端回覆且建立連線,即可傳送資
12
13
接下來,我們將實際利用JAVA程式語言來實現基本的一對一網路傳輸,在 這邊必須分別撰寫Server端及Client端的JAVA程式,在撰寫程式之前,我們會先 匯入網路程式設計使用到的Package,分別是 java.net.*以及 java.io.*兩個Package。
java.net.* 內含的類別和介面,常用於開發網路程式的部分,可實現建立網路平台 以及建立網路連線。 java.io.* 內含的類別和介面,則可以用於資料傳遞,實現傳 送資料和接收資料。匯入方式如下面文字方塊所示,這樣就可以使用Package中定 義的許多類別及方法。
2.2.2 Server 端程式:
首先是Server端程式,使用到 java.net.*中的網路伺服器平台類別 ServerSocket類別,宣告出ServerSocket的物件ss,可在任一台電腦上建立起 Server端,用來等待Client端的連線,ServerSocket()內的port為網路連接埠,
在這邊我們預設為1234接口:
用Socket 類別宣告出物件socket:
使用ServerSocket類別中方法accept(),用來準備建立與Client端的連線,連線 Import java.net.*;
Import java.io.*;
ServerSocket ss = new ServerSocket(port);
Socket socket;
14
後產生socket平台:
另外可以從socket物件中獲得一些資訊,使用Socket 類別的方法
getInetAddress().getHostAddress(),可將其連接Client端的IP顯示出來,即可獲得 Client端的IP地址:
接下來,我們必須打開網路串流,所以使用java.io.* 中的網路輸入串流
DataInputStream類別建立物件instream,並用Socket 類別的方法getInputStream(),
獲得Client端的資料串流,即可打開網路輸入串流,準備從網路上接收資料串流:
此外,接受到網路輸入串流後,準備在Server端將資料讀出,使用java.io.* 中 的檔案輸出串流FileOutputStream類別,宣告出物件bw,並指定好輸出的檔案名稱,
在這邊是將資料存放在outfilename中,而outfilename的路徑待會執行Server端程式 時才會指定:
使用while迴圈,從網路讀取Client端所傳來的資料,並用DataInputStream類 socket= ss.accept();
System.out.println("connected from client "+
socket.getInetAddress().getHostAddress());
instream = new DataInputStream(socket.getInputStream());
FileOutputStream bw = new FileOutputStream(outfilename);
15
messagein = instream.readInt();//一個字元一個 bw.write(messagein); //讀出資料
}
File file = new File("C:\\Users\\paulpaul1337\\s\\output1.bmp");
outstream = new DataOutputStream(socket.getOutputStream());
16
FileInputStream fis = new FileInputStream(file);
while((int i = fis.read())!=-1)
17 送給Server端的資料。而且使用java.io.* 中的網路輸出串流DataOutputStream類別,
準備將資料傳送出去:
接著使用java.io.* 中的FileInputStream類別,宣告 fis物件,準備先將Client 端的資料讀出,準備送入網路串流傳輸給 Server端,而 infilename則在執行Client 端程式才會輸入檔案名稱:
接下來採用while迴圈,從Client端指定的檔案名稱,使用FileInputStream類別 中方法read(),先讀出一個字元的資料,判斷是否為結尾字元,若是結尾字元則停 止傳輸,代表檔案傳輸完成;若不是則用DataOutputStream類別中的wrireInt(),將 檔案一個字元一個字元寫入網路串流中。以此類推,反覆執行直到資料讀出完成;
Socket socket;
socket = new Socket(InetAddress.getByName(servername),1234);
outstream = new DataOutputStream(socket.getOutputStream());
FileInputStream fis = new FileInputStream(infilename);
18 路輸入串流DataInputStream類別建立物件instream,並用Socket 類別的方法
getInputStream(),獲得Client端的資料串流,即可打開網路輸入串流,準備從網路
outstream.writeInt(i);
}
outstream.writeInt(i);
outstream.flush();
instream = new DataInputStream(socket.getInputStream());
FileOutputStream fos = new FileOutputStream("C:\\Users\\output1.bmp");
19
使用while迴圈,從網路讀取Server端所傳來的資料,並用DataInputStream類 別的方法readInt(),先讀出一個字元的資料,判斷是否為結尾字元,若是結尾字 元則停止傳輸,代表檔案傳輸完成;若不是則寫入Client端剛剛指定好的檔案名稱。
以此類推,反覆執行直到資料讀出完成:
int message;
while(messagein!=-1) {
messagein = instream.readInt();
fos.write(messagein);
}
20
2.3 實際程式
以下是完整Server端的程式,在這邊Server端將會收到BMP圖檔以及TXT文字 檔,並回傳一個BMP圖檔:
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.lang.*;
// 匯入相關套件 public class server19 {
static ServerSocket ss;
Socket socket;
static int port;
static String outfilename;
static String outfilename2;
DataOutputStream outstream;
public server19() {
try {
ss = new ServerSocket(1234);
21
while(true)
// 持續偵測是否有 Client 端連線 {
System.out.println("server created");
System.out.println("waiting for client to connect....");
socket= ss.accept();
//回覆 Client 端並建立連線
System.out.println("connected from client "+
socket.getInetAddress().getHostAddress());
instream = new DataInputStream(socket.getInputStream());
// 接收資料
FileOutputStream fos = new FileOutputStream(outfilename);
messagein = 0;
messagein2 = 0;
while(messagein!=-1) {
messagein = instream.readInt();
bw.write(messagein);
}
22
FileOutputStream fos2 = new FileOutputStream(outfilename2);
while(messagein2!=-1) {
messagein2 = instream.readInt();
fos2.write(messagein2);
}
System.out.println("Please waiting");
File file = new File("C:\\Users\\paulpaul1337\\s\\output1.bmp");
outstream = new DataOutputStream(socket.getOutputStream());
//準備回傳資料給 Client 端
FileInputStream fis = new FileInputStream(file);
while((i = fis.read())!=-1) {
outstream.writeInt(i);
}
outstream.writeInt(i);
outstream.flush();
System.out.println("BMP Data had sent to internet successfully");
// 完成傳輸
23
public static void main(String[] args) {
if(args.length < 2) {
System.out.println("Usage:java server19 [XXX.bmp][XXX.txt]");
// 選取要傳送的資料 System.exit(1);
}
outfilename = args[0];
outfilename2 = args[1];
server19 serverstart = new server19();
} }
24
以下是完整Client端的程式,在這邊Client端將會傳送BMP圖檔以及TXT文字檔:
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.lang.*;
// 匯入相關套件 public class client19 {
int i;
Socket socket;
static String servername;
static int port;
static String infilename;
static String infilename2;
DataOutputStream outstream;
public client19() {
try {
25
socket = new Socket(InetAddress.getByName(servername),1234);
// 發送要求連線的訊息至Server端
outstream = new DataOutputStream(socket.getOutputStream());
//傳送資料
FileInputStream fis = new FileInputStream(infilename);
while((i = fis.read())!=-1) {
outstream.writeInt(i);
}
outstream.writeInt(i);
outstream.flush();
System.out.println("BMP Data had sent to internet successfully");
while((i = fis2.read())!=-1) {
outstream.writeInt(i);
}
outstream.writeInt(i);
outstream.flush();
System.out.println("TXT Data had sent to internet successfully");
} } }
// 完成傳輸
26
System.out.println("waiting for server");
instream = new DataInputStream(socket.getInputStream());
// 有無資料回傳
FileOutputStream fos = new FileOutputStream("C:\\Users\\output1.bmp");
//接受資料
while(messagein!=-1) {
messagein = instream.readInt();
fos.write(messagein);
}
System.out.println("BMP data had accepted from server successfully");
}
//完成傳輸
27
public static void main(String[] args) {
if(args.length < 3) {
System.out.println("USAGE:java client19 [servername][xxx.bmp][xxx.txt]");
System.exit(1);
}
servername = args[0];
infilename = args[1];
infilename2 = args[2];
client19 clientstart = new client19();
} }
28
2.4 基本成果說明及討論
我們分別編譯兩邊的程式,在這邊為了實驗方便,我們Server端和Client端的 電腦皆是用同一台。
首先是Server端,JAVA的執行方式必須先打開Command Line 模式,見圖2.4,
鍵入”javac [程式名稱].java”,即可編譯整個JAVA程式。
圖 2.4 鍵入”javac [程式名稱].java”
編譯完成後,接下來要執行JAVA程式,見圖2.5,鍵入”java [程式名稱]
[outfilename][outfilename2]”,程式名稱在這裡是server19 。而outfilename是Server 端收到BMP圖檔後,想要的檔案名稱,這裡我們將其存成input.bmp 檔。
outfilename2則是Server端收到TXT文字檔,將其存成input.txt 檔。
圖 2.5 鍵入”java [程式名稱] [outfilename][outfilename2]”
29
執行完後,就會印出圖2.6的訊息,分別是”server created” 和”waiting for client to connect”,等待Client端的連線。
圖 2.6 顯示”server created” 和”waiting for client to connect”
Server端程式開啟後,下一步要編譯Client端的程式,打開另一個Command
Line 模式作為Client端,見圖2.7,鍵入”javac [程式名稱].java”。
圖 2.7 ”javac [程式名稱].java”
編譯完成後,接下來要執行程式,見圖2.8,鍵入java [程式名稱] [Server 端IP地址][infilename][infilename2],程式名稱在這裡是client19 。與Server端不同 的是,執行Client端程式時,必須將Server端IP地址鍵入。而infilename是Client端 要傳送的BMP圖檔名稱,這裡我們要傳的是170.bmp 檔。infilename2是Client端要
30
傳送的TXT文字檔,傳的是170.txt 檔。
圖2.8 鍵入java [程式名稱] [Server端IP地址][infilename][infilename2]
見圖2.9,執行Client端程式時,就會發現Server端的地方,顯示”connect from client 140.122.184.183” ,代表建立和Client端 的連線。
圖 2.9 顯示”connect from client 140.122.184.183”
見圖2.10,建立連線後,Client端就可以將資料傳送給Server端,傳送完成後,
顯示”Data from internet sent to file successfully.”。
圖 2.10 顯示”Data from internet sent to file successfully.”
31
見圖2.11,Client端傳送BMP圖檔和TXT文字檔成功,顯示”BMP/TXT Data sent to internet successfully”。
圖 2.11 顯示”BMP/TXT Data sent to internet successfully”
見圖 2.12,Client 端傳送完資料後,等待 Server 端回傳資料。
圖 2.12 等待 Server 端回傳資料 見圖 2.13,Server 端準備將資料回傳給 Client 端。
圖 2.13 Server 端準備將資料回傳給 Client 端
見圖 2.14,Server 端成功將資料回傳給 Client 端,顯示”BMP data sent to internet successfully.”。
32
圖 2.14 顯示”BMP data sent to internet successfully.”
見圖 2.15,Client 端從 Server 端成功收到資料,顯示”BMP data has accepted from server successfully.”。
圖 2.15 顯示”BMP data has accepted from server successfully.”
33
2.5 Android 平台介紹
Android 是一套開放的行動裝置作業系統平台,以 Linux 作業系統為基礎開 發的開放原始碼(Open Source)作業系統。最初為安迪魯賓(Andy Rubin)創辦的公司 研究開發的行動作業系統,直到被 Google 購併之後,以機器人為圖案如圖 2.16,
正式對外公布 Android 此作業系統,並且和數家硬體製造商、軟體開發商、電信 營運商合作成立開放手機聯盟(Open Handset Alliance,OHA),持續開發改良此系 統。為了吸引更多的開發人員投入,Google 開放 Android 的原始碼,讓許多硬體 製造商如台灣的宏達電公司和韓國三星科技公司開發屬於自己的行動裝置,無論 是智慧型手機和平板電腦,皆以 Android 系統為基礎開發。而且 Google 也發布專 屬的 Google Play 線上應用程式商店,推出將近 60 萬個官方認證的應用程式給使 用者下載,形成龐大的行動裝置生態圈。
圖 2.16 Android 圖案
2.5.1 Android 系統的優點:
Android 作業系統自推出之後,即受到許多開發人員的歡迎,不僅是因為
34
Google 大力支持,其實 Android 作業系統還有很多優點,以下是有關 Android 作 業系統的優點。
1. 市場占有率第一:
根據 IDC(International Data Corporation)2013 年第一季的報告指出,目前智慧型 手持裝置的作業系統中,Android 作業系統的市場佔有率為 79%的比例拿下第 一。
Android 作業系統支援常見的視訊和音樂,以及各種圖片格式,如 H.264、
MPEG4、MP3、BMP、JPG 等等。
5. 應用程式間可以相互溝通:
在 Android 作業系統平台下所開發的應用程式,程式之間只需要簡單的宣告,
即可以相互溝通,達成資料共享或是存取呼叫其他應用程式;抑或是將自己
35
所開發的應用程式開放給其他應用程式。
6. 支援許多網路通訊協定:
Android 作業系統支援許多網路通訊協定,如 GSM/EDGE、CDMA、Bluetooth、
Wi-Fi、LTE、NFC、WiMax 等等。
2.5.2 Android 平台架構:
了解 Android 作業系統的特色和優點後,接下來要介紹整個 Android 平台的
了解 Android 作業系統的特色和優點後,接下來要介紹整個 Android 平台的