108年01學期四筒老師這學期的課程是網路程式設計,教學程式語言歸屬Java,每天接觸這類語言成為習慣,也不必替自己切換其他語言教學,所以最熟習也可以提供學生在開發過程發生的問題,利用課堂上說說個人專案開發經驗與歷程,好比說新手自認為會撰寫程式就非常厲害,好像天上飛的地上爬的都可以得到,碰到問題就埋頭苦幹,無法解決問題時就是老鳥教訓菜鳥一樣,永遠就像迴圈一樣上演相同情境。
Java Platform, Standard Edition
Java SE 為標準之Java 版本,此版本一般適用於個人電腦以至於一般Workgroup Server 的Internet 應用程式開發上,包括:
- Java SDK(Software Development Kit, 則JDK)
- 開發所需之附屬工具,如Debug 除錯工具、Java 文件產生器、
- Java Archive(JAR)檔案產生器、Java AppletViewer等
- Java API Packages
- JRE(Java Runtime Environment)
Java各應用平臺的基礎,想要學習其他的平臺應用,必先瞭解Java SE以奠定基礎,Java SE也正是本書主要的介紹對象。
Java SE可以分作四個主要的部份:JVM、JRE、JDK與Java語言。
為了要能運行Java撰寫好的程式,必須有Java虛擬機器(Java Virtual Machine, JVM)。JVM包括在Java執行環境(Java SE Runtime Environment, JRE)中,所以為了要運行Java程式,必須安裝JRE。如果要開發Java程式,必須取得JDK(Java SE Development Kits),JDK包括JRE以及開發過程中需要的一些工具程式,像是javac、java等工具程式。
Java語言只是Java SE的一部份,除了語言之外,Java最重要的就是提供龐大且強大的標準API,提供字串處理、資料輸入輸出、網路套件、使用者視窗介面等功能,你可以使用這些API作為基礎來進行程式開發,無須重複開發功能相同的元件,事實上,在熟悉Java語言之後,更多的時候,都是在學習如何使用Java SE提供的API 來組成應用程式。
Java 程式範例
IP Example
package com.four.bots.server;
import java.net.InetAddress;
public class MyHostAddress {
public static void main(String[] args) {
String host = "www.google.com";
if(args.length > 1) host = args[0];
InetAddress addr = null;
try {
// 使用java.net.InetAddress 類別解析domain 相關資訊。
addr = InetAddress.getByName(host);
System.out.println("網域名稱:" + addr.getHostName());
System.out.println("IP 位址:" + addr.getHostAddress());
System.out.println("本機名稱:" + InetAddress.getLocalHost());
}catch(Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("system error:" + e.getMessage());
}finally {
/** 結束前,需釋放資源。 */
addr = null;
}
}
}
URL Example
package com.four.bots.server;
import java.net.URL;
public class MyUrlParse {
public static void main(String[] args) {
String urlName = "https://tw.search.yahoo.com:8080/search?fr=ush-bt1&p=%E5%9B%9B%E7%AD%92#user";
if(args.length > 1) urlName = args[0];
URL url = null;
try {
// 使用java.net.URL 類別解析domain 相關資訊。
url = new URL(urlName);
System.out.println("主機: " + url.getHost());
System.out.println("埠號: " + url.getPort());
System.out.println("協定: " + url.getProtocol());
System.out.println("檔案: " + url.getFile());
System.out.println("參數: " + url.getQuery());
System.out.println("引用: " + url.getRef());
} catch (Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("system error:" + e.getMessage());
} finally {
/** 結束前,需釋放資源。 */
url = null;
}
}
}
TCP/IP協定 Example
Socket Server Example
package com.four.bots.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MySocketServer {
public static void main(String[] args) {
Socket sock = null;
String data = null;
ServerSocket srv = null;
BufferedReader br = null;
InputStreamReader sr = null;
try {
// 建立ServerSocket物件,並設定埠號9000。
srv = new ServerSocket(9000);
System.out.println("開始等待Clint 端上傳訊息");
// Client提出請求,accept()會傳回一個Socket物件,並讓sock 指向它。
sock = srv.accept();
System.out.println("Clint 端connected");
// 當Socket持續在連接時,往下開始作業。
while(sock.isConnected()){
// 取得Clint 端的訊息。
sr = new InputStreamReader(sock.getInputStream());
br = new BufferedReader(sr);
// 接收訊息字串。
data = br.readLine();
//當Client disconnect時,readline會傳回 null
if(data == null) break;
// 接收列印Client 端訊息。
System.out.println(data);
}
} catch (Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("system error:" + e.getMessage());
} finally {
/** 結束前,需釋放資源。 */
if(sock != null) {
try {
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(srv != null && srv.isClosed() == false) {
try {
srv.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Socket Client Example
package com.four.bots.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class MySocketClient {
public static void main(String[] args) {
Socket srv = null;
BufferedReader br = null;
BufferedWriter bw = null;
InputStreamReader sr = null;
OutputStreamWriter sw = null;
String localhost = "127.0.0.1";
try {
// 建立Socket物件,並設定ip(127.0.0.1 屬於本機)和埠號
srv = new Socket(localhost, 9000);
System.out.println("建立連線Server 端");
// 利用srv 來取得輸出串流
sw = new OutputStreamWriter(srv.getOutputStream());
bw = new BufferedWriter(sw);
while (srv.isConnected()) {
// 透過輸入串流來取得Client的輸入
sr = new InputStreamReader(System.in);
br = new BufferedReader(sr);
System.out.print("client:");
// 寫入輸出串流。
bw.write("send[" + br.readLine() + "]\n");
bw.flush();// 立即傳送
}
} catch (Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("client error:" + e.getMessage());
} finally {
/** 結束前,需釋放資源。 */
if (sw != null) {
try {
sw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (srv != null && srv.isClosed() == false) {
try {
srv.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
UDP協定 Example
UDP Server Example
package com.four.bots.server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class MyUDPServer {
private int port;
private DatagramSocket srv = null;
public MyUDPServer(int portNumber) throws SocketException {
this.port = portNumber;
this.srv = new DatagramSocket(this.port);
}
/** 關閉UDP Server,釋放資源。 */
public void close() {
if (this.srv != null) {
if (this.srv.isClosed() == false) {
this.srv.close();
this.srv.disconnect();
}
}
}
/** UDP Server 開始監聽作業。 */
private void listen() throws Exception {
String message = null;
System.out.println("-- Running Server at " + InetAddress.getLocalHost() + "--");
/** 宣告變數名稱。 */
byte[] buffer = null;
InetAddress address = null;
String clientAddress = null;
DatagramPacket packet = null;
try {
while (true) {
buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
// blocks until a packet is received
this.srv.receive(packet);
// 取得Client 端位址。
address = packet.getAddress();
clientAddress = address.getHostAddress();
// 接收Client 端訊息。
message = new String(packet.getData());
// 紀錄Client 端接收列印。
System.out.println("message from[" + clientAddress + "]: " + message);
}
} catch(Exception e) {
throw e;// 拋出錯誤訊息。
} finally {
packet = null;
buffer = null;
}
}
public static void main(String[] args) {
int port = 9000;
MyUDPServer srv = null;
try {
srv = new MyUDPServer(port);
srv.listen();
} catch (Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("system error:" + e.getMessage());
} finally {
/** 結束前,需釋放資源。 */
try {
srv.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
UDP Client Example
package com.four.bots.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class MyUDPClient {
private int port;
String message = null;
private Scanner scanner = null;
private DatagramSocket srv = null;
private InetAddress srvAddress = null;
public MyUDPClient(String host, int portNumber) throws IOException {
this.srvAddress = InetAddress.getByName(host);
this.port = portNumber;
this.srv = new DatagramSocket();
this.scanner = new Scanner(System.in);
}
private void start() throws Exception {
byte[] beffer = null;
DatagramPacket packet = null;
while (true) {
message = scanner.nextLine();
beffer = message.getBytes();
packet = new DatagramPacket(beffer, beffer.length, this.srvAddress, this.port);
this.srv.send(packet);// 上傳UPD Server 訊息。
}
}
private void close() {
if(this.srv != null) {
this.srv.close();
}
message = null;
srvAddress = null;
if(scanner != null) {
scanner.close();
}
}
public static void main(String[] args) {
int portNumber = 9000;
String host = "127.0.0.1";
MyUDPClient client = null;
try {
client = new MyUDPClient(host, portNumber);
System.out.println("-- Running UDP Client at " + InetAddress.getLocalHost() + " --");
client.start();
} catch (Exception e) {
e.printStackTrace();
// 顯示發生錯誤訊息
System.out.println("system error:" + e.getMessage());
} finally {
/** 結束前,需釋放資源。 */
if (client != null) {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}