Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Client/Server
●
Class ( 類別 )
●
Exception Handling ( 例外處理 )
●
Thread ( 執行緒 )
●
Networking
Class: Object-Based Programming
( 以物件為基礎的程式設計 )
What Is Object?
●
東西
●
An instance of an object.
●
An object is a software bundle of related state a
nd behavior.
What Is Object?
●
讓我們把世界看成是㆒個由物件( object )所組
成的大環境。物件是什麼?白一點說,「東西」
是也!任何實際的物體你都可以說它是物件。為
了描述物件,我們應該先把物件的屬性描述出
來。好,給「物件的屬性」一個比較學術的名
詞,就是「類別」( class )。
What Is Class?
●
A class is a blueprint or prototype from which ob
jects are created.
●
Sample
–
Bicycle
●
Attribute
●
Behavior
Class Definition
class className
{
attributes; // Member variables;
behairs; //Member functions;
};
Example:Bicycle
Member variablesMember variables
Member functionsMember functions
class nameclass name
Exercise
●
請設計一個 Point 類別。
–
參考 Bicycle.java
參考答案
Q & A
Class Members
●
private ( 私有的 )
●
protected ( 受保護的 )
●
public ( 公開的 )
public
protected
Access Level
●
public
–
每個人都看得到
●
protected
–
子類別也可以看到
●
private
–
除了自己以外,別人都不能看
●
friend
●
Example: AccessLevel
private
Exercise
●
請實作資料結構的堆疊 Stack 。
–
參考 C 版本的 Stack (在 HW 資料夾)
●
Data Structures(Stacks).pdf :觀念講解
Exception Handling
Java 的例外處理
●
Java 語言的「例外」( Exception )是指產生了
例外物件,這是一種例外事件,在程式執行時,
發生不正常執行狀態時所產生事件的物件,「例
外處理」( Handling Exceptions )就是在處理
這些例外事件。
●
例外處理的目的是為了讓程式能夠更「強壯」
( Robust ),當程式遇到不尋常情況,也不會
造成程式「崩潰」( Crashing ),進而導致整
個系統當機。
Exception
●
Checked Exceptions ( 編譯時會檢查 )
–
Ex: File cannot be found
●
Runtime(unchecked) Exceptions ( 執行時
才會檢查 )
–
Ex: nullpointer exception, array index out of
bound
●
Errors
–
Ex: stack overflow
例外處理的架構 - 圖例
例外處理的架構 - 過程
●
在執行 Java 程式時,從 main() 方法呼叫 methodA()
方法,接著呼叫 methodB() 方法,最後呼叫
methodC() 方法,呼叫過程是存入稱為「呼叫堆疊」
( Call Stack ),這是一種先進後出的資料結構,用
來儲存呼叫方法的狀態資料,以便返回還原成呼叫時
的狀態。
●
當 methodC() 方法發生錯誤產生例外物件 A , JVM 倒
過來找尋方法是否擁有例外處理,首先是 methodC()
和 methodB() ,因為沒有例外處理,所以例外會傳遞
給 methodA() ,在此方法擁有例外處理 A ,所以可以
處理例外物件 A 。
The call stack
https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
Call stack
https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
例外處理的程式敘述
●
Java 語言例外處理程式敘述分為 try 、 catch 、 finally
三個程式區塊,可以處理特定的例外物件,如下所示
:
try
{ ……… }
catch(ExceptionType e)
{ // 例外處理
……… }
finally
{ ……… }
try 程式區塊
try 程式區塊
●
在 try 區塊的程式碼檢查是否產生例外,當例外
產生時,就會丟出指定例外類型的物件。
catch 程式區塊
catch 程式區塊
●
在 try 程式區塊的程式碼如果丟出例外, Java 程式需
要準備一到多個 catch 程式區塊處理不同類型的例外
,傳入參數 e 是例外類型的物件(繼承自 Throwable
類別),可以取得例外的相關資訊,其相關方法如下
表所示:
方法 說明
String getMessage() 傳回例外說明字串
void printStackTrace() 顯示程式呼叫的執行過程
finally 程式區塊
finally 程式區塊
●
finally 程式區塊可有可無,主要是用來執行程式
善後,不論例外是否產生,都會執行此區塊的
程式碼。
例外的繼承架構
Example
●
CheckArgsDemo
●
CheckedExceptionDemo
●
InputExceptionDemo
●
ListOfNumbers
●
ThrowDemo
●
CatchWho
●
ThrowsDemo
Exercise
●
寫一程式可處理
FileNotFoundException 。
Thread
Example
●
賽馬遊戲
–
HorseRace.java
–
如何判斷第一名?
●
MD5 Calculator
–
MD5Calculator.java
●
多執行緒的好處
●
寫個程式,它可以不斷地重覆我們講的
話,直到我們輸入零為止。
–
EchoMachine.java
●
改用多執行緒來寫
–
MultiThreadEchoMachine.java
●
I/O 和 CPU 之間的速度差距
–
LimitedPrintln.java
執行緒的生命週期
http://www.roseindia.net/java/thread/life-cycle-of-threads.shtml
• BlockDemo.java
執行緒的生命週期
http://openhome.cc/Gossip/JavaEssence/ThreadLifeCycle.html
Java 多執行緒工具的位置
●
java.util.Timer class
–
提供排程執行一套任務的工具。程式可透過 Timer 提供
的方法設定要執行的程式碼和執行時機點 ,或著以固定
週期不斷重覆執行。
●
java.util.TimerTask abstract class implements
Runnable
–
Timer 要執行的程式碼,必須寫在繼承了 TimerTask 個
抽象類別的一般類別中, 這樣才能做為設定 Timer 的方
法之參數。
●
如果排程中想做的事情沒有和主要執行緒共用參數 ( 例如 Timer 執行緒和主執行
緒的變數都參考到同一個物件 ) ,那 Timer 就很夠用了。
Example
●
TimerDemo.java
–
Timer 物件在啟動排程後,如果要停止,則要
執行 cancel() 方法
●
Java 多執行緒工具
●
java.lang.Runnable interface
●
java.lang.Thread class
–
Runnable 介面和 Thread 類別是 Java 裡面最
主要產生執行緒的方式
●
Object Class
–
Object 這個所有物件的父母類別提供一些執行
緒互相傳遞訊息的方法 [notify(), notifyAll(),
wait(), yield()]
●
Example
●
SubThread.java
●
Runa.java
Java 多執行緒工具
●
java.lang.ThreadGroup class
–
提供一些方法管理一整束的執行緒,只要執行緒建立
時,以 ThreadGroup 名稱作為建構式的參數,就可以
透過 ThreadGroup 管理執行緒。
–
每個執行緒都屬於某個「執行緒群組」
( ThreadGroup )管理的一員
●
java.lang.ThreadLocal class
–
負責複製物件內容給不同執行緒參考,以避免共用物件
產生的問題。
●
Example
●
ThreadGroupDemo.java
●
ThreadLocalDemo.java
Java 多執行緒工具的
●
java.lang.IllegalMonitorStateException
–
當有一個沒有其他物件鎖定的類別,試突干擾其他物件的鎖定狀態
時,就會丟出這種例外。
●
java.lang.IllegalThreadStateException
–
重複執行 start() 方法,會丟出 IllegalThreadStateException 。
●
java.lang.InterruptedException
–
有些執行緒操作方式天生就容易製造出 liveness 問題。對於這類型
的操作, java 在設計時,就令某一執行緒在這種操作下 ,如果被
其他執行緒 interrupt ,就會丟出這種例外,離開原先的狀態,使得
程式設計者有辦法令執行緒釋出鎖定。
Exercise
●
撰寫一程式含有兩個執行緒,分別做下面
兩件事:
–
Thread A: 等待使用者輸入一整數值。
–
Thread B: 輸出 0 到一整數值 ( 從 Thread A 所
輸入 ) 的隨機亂數
●
Networking
Ping
ping uses the ICMP protocol's ECHO_REQUEST datagram.
The host’s answer is an ICMP ECHO_RESPONSE.
netstat
Wireshark
Basics
Basic
physical layer physical layer
InterNetInterNet
(Peer to Peer) Protocol
interfaces
Basics
●
TCP (Transmission Control Protocol) is a
connection-based protocol that provides a
reliable flow of data between two computers.
●
UDP (User Datagram Protocol) is a protocol
that sends independent packets of data, called
datagrams, from one computer to another with
no guarantees about arrival. UDP is not
connection-based like TCP.
IP Address
●
InetAddress
–
沒連上網路時?
–
實體 IP
–
虛擬 IP
●
DNS
–
www.facebook.com
–
Java I/O Stream
從資料來源讀取資料的 input stream
將資料寫出到目的地的 output stream
從資料來源讀取資料的 input stream
將資料寫出到目的地的 output stream
Stream 的概念
stream 是資料輸入及輸出的通道
Stream 的概念
stream 是資料輸入及輸出的通道
input stream( 輸入水管 ) :
指定輸入源 ( 從別人家接水管到我家,接水 )
output stream( 輸出水管 ) :
指定輸出地 ( 從我家接水管到別人家,送水 )
input stream( 輸入水管 ) :
指定輸入源 ( 從別人家接水管到我家,接水 )
output stream( 輸出水管 ) :
指定輸出地 ( 從我家接水管到別人家,送水 )
Stream 是一個通化的概念, java.io package 支援 stream
import java.io.*;
import java.io.*;
Object
InputStream
File
RandomAccessFile
OutputStream
Reader
Wrtier
ByteArrayInputStream
StringBufferInputStream
FileInputStream
SequenceInputStream
FilterInputStream
PipedInputStream
ObjectInputStream
ByteArrayOutputStream
StringBufferOutputStream
FileOutputStream
SequenceOutputStream
FilterOutputStream
PipedOutputStream
ObjectOutputStream
BufferedInputStream
DataInputStream
LineNumberInputStream
PushbackInputStream
BufferedOutputStream
DataOutputStream
PrintStream
BufferedWriter
StringWriter
CharArrayWriter
PrintWriter
FilterWriter
PipedWriter
OutputStreamWriter FileWriter
BufferedReader
StringReader
CharArrayReader
FilterReader
PipedReader
InputStreamReader FileReader
50
Java I/O Stream
輸入源 輸出地
inputStream
OutputStream
51
InputStream
以 byte 為讀取單位的輸入通道 ( 程式拿 byte 的水杯來接水 )
InputStream
以 byte 為讀取單位的輸入通道 ( 程式拿 byte 的水杯來接水 )
OutputStream
以 byte 為單位的輸出通道 ( 程式拿 byte 的水杯來送水 )
OutputStream
以 byte 為單位的輸出通道 ( 程式拿 byte 的水杯來送水 )
Reader
以兩個 byte(character) 為讀取單位的輸入通道
Reader
以兩個 byte(character) 為讀取單位的輸入通道
Writer
以兩個 byte(character) 為單位的輸出通道
Writer
以兩個 byte(character) 為單位的輸出通道
52
為什麼要 two bytes?
以兩個 byte 為讀寫單位的輸出及輸入通道主要是
用以讀寫以 Unicode 或亞洲文字編碼的資料。
以兩個 byte 為讀寫單位的輸出及輸入通道主要是
用以讀寫以 Unicode 或亞洲文字編碼的資料。
53
Java I/O 作用
●
讀取及寫入檔案
• 網路通訊
●
過濾資料
●
加 / 解 密
●
壓 / 解壓 縮
●
在 thread 之間傳送資料
●
把物件寫入串流
●
檔案和目錄之操作
●
讓 user 中 GUI 介面選取檔案
• Java 所有 I/O 動作都是以串流為基礎
InputStream
OutputStream
FilterInputStream
FilterOutputStream
PipedInputStream
PipedOutputStream
ObjectInputStream
ObjectOutputStream
File
FileInputStream
FileOutputStream
54
write
read
OutputStream
InputStream
Stream 操作
File2_out
File1_in
程式
55
各種分類
• InputStream 
• OutputStream 
• Reader 
• Writer 
●
File
--- 表示其子類別有各自不同的型態運用
BufferedWriter
CharArrayWriter
FilterWriter
PipedWriter
StringWriter
不同的用途
Byte 位元組
Char 字元
56
不同種類的串流
●
輸入串流
●
輸出串流
●
檔案串流
●
網路串流
●
濾器串流
●
資料串流
 記憶中的串流
 壓縮串流
 密文串流
 物件串流
 Reader
 Writer
57
●
InputStream stdin = System.in;
●
OutputStream stdout = System.out;
●
OutputStream stderr = System.err;
鍵盤鍵盤
螢幕
( 錯誤訊
息 )
螢幕
( 錯誤訊
息 )
螢幕螢幕
標準輸入
標準輸出
錯誤輸出
標準輸入
標準輸出
錯誤輸出
58
InputStreamReader converter=new InputStreamReader(System.in);
BufferedReader in=new BufferedReader(converter);
InputStream
Reader
InputStream
InputStreamReader
BufferedReader
59
InputStream
import java.io.*;
public class StreamPrinter{
InputStream myInput;
public static void main(String[] args){
myInput=System.in;
try{
while(true){
int datum=myInput.read();
if(datum==-1) break;
System.out.println(datum);
}
}catch(IOException e){ }
}
}
InputStream stdin=System.in;
60
OutputStream
import java.io.*;
public class AsciiChart{
public static void main(String[] args){
for(int i=32;i<127;i++){
System.out.write(i);
if(i%8==7)
System.out.write(‘n’);
else
System.out.write(‘t’);
}
System.out.write(‘n’);
}
}
OutputStream stdout=System.out;
61
Network Stream
●
Stream source
URL,URLConnection,
Socket,ServerSocket
62
try{
URL u=new URL(http://www.fcu.edu.tw/);
InputStream in=u.openStream();
int b;
while((b=in.read())!=-1){
System.out.write(b);
}
}
catch(MalformedURLException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
URL
63
try{
URL u=new URL(http://www.fcu.edu.tw/);
URLConnection uc=u.getCOnnection();
uc.connect();
InputStream in=uc.getInputStream();
}
catch(IOException e){
System.err.println(e);
}
URLConnection
64
Socket s=new Socket(host,80);
String request=“my Request”;
byte[] b=request.getBytes();
OutputStream out=s.getOutputStream();
InputStream in=s.getInputStream();
out.write(b);
out.flush();
Socket
65
try{
ServerSocket ss=new ServerSocket(80);
while(true){
Socket s=ss.accept();
OutputStream out=s.getOutputStream();
…
s.close();
}
catch(IOException e){
System.err.println(e);
}
}
ServerSocket
Socket
Socket
●
Socket 最早緣起於 Unix ,而在 Unix 的檔案可以
用開啟 open -> 讀寫 write/read -> 關閉 close
的模式來操作,所以 Socket 在 Unix 當中也遵循
這樣的操作模式,算是一種文件, Socket 所提
供的 API 就是可以進行的操作(開啟 / 關閉、讀
寫)。
●
使用 TCP/IP 協定的程式都是採用 Socket 來進
行連接傳輸的介面,最常見的例子就是網頁瀏覽
器,底層都是用 Socket 去做連接通信的介面。
Socket
來源
http://www.cs.bgu.ac.il/~spl121/wiki.files/tcp[1].gif
Socket in Client/Server
Client server
connection (full duplex)
Socket
InputStream
InputStream OutputStream
OutputStream
Flow
1.Open a socket.
2.Open an input stream and output stream
to the socket.
3.Read from and write to the stream
according to the server's protocol.
4.Close the streams.
5.Close the socket.
Example
●
EchoClient.java
●
EchoServer.java
Exercise: ChatRoom
●
一對一聊天室
Exercise: ChatRoom
●
一對一聊天室
●
一對多聊天室
Contact
●
E-mail: pinglunliao [at] gmail [dot] com
●
LINE: Holan.Liao
References
●
[ ]Java分享 多執行緒程式設計
●
TutorialPoints: Java
●
The Java Tutorials: Networking
●
Youtube: Java Thread
●
...

More Related Content

Java 網路程式

Editor's Notes

  1. 使用start()方法啟用Thd,start()方法只能執行一次,重複,會丟出IllegalThreadStateException。執行start(),執行緒進入可執行(Runnable)狀態,排班器將執行緒排入CPU執行(Running)。 執行緒有其優先權,由1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY),預設是 Thread.NORM_PRIORITY(5),IllegalArgumentException。優先權相同,則輸流執行(Round-robin方式)。 不支援timeslicing的 作業系統,每一個執行緒必須完成後,才能輪到下一個執行緒,yield()方法,例如: Thread thread = new Thread(new Runnable() { public void run() { // .... while(true) { // .... Thread.yield(); // 暫時讓出執行權 } } }); thread.start(); 當執行緒嘗試進入synchronized區塊,必須先在物件的鎖定池(Lock Pool)競爭鎖定,只有取得鎖定的執行緒,才會進入可執行狀態,等待CPU排班器排入執行。 如果執行中(Running)的執行緒有取得物件鎖定,而此時呼叫了wait(),則會釋放物件鎖定進入等待池(Wait Pool),直到呼叫了notify()、notifyAll()、Interrupt()或wait()逾時,回到物件的鎖定池(Lock Pool)競爭鎖定,只有取得鎖定的執行緒,才會進入可執行狀態,等待CPU排班器排入執行。 在阻斷狀態或等待池中的執行緒,若呼叫了interrupt(),則會丟出InterruptedException例外物件。