Oracle Java網路程式設計課程 Example

four bots

Oracle Java網路程式設計課程 Example

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 SE 8.0

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 SE 的組成概念圖

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;
		}
	}
}
IP Example 執行結果

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;
		}
	}
}
URL Example 執行結果

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();
				}
			}
		}
	}
}
TCP/IP 協定 Example 執行結果

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();
				}
			}
		}
	}
}
UDP 協定 Example 執行結果