1. Java API String類
1.1. 什麼是API
API全名:Application Programming Interface,API是應用程序編程接口,指一些預先定義好的類。
例如我們想要一臺電腦,並不需要自己生產每個零件,只要從各個廠商買到組裝電腦的零件就可以,然後根據說明書學會使用,將零件安裝在一起就得到了電腦。電腦就像是我們要的程序,而零件就是API,說明書就是幫助文檔。
1.2. Java API
Java API就是Sun公司提供給我們使用的類,這些類將底層的實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用。
我們可以通過查幫助文檔來了解Java提供的API如何使用
1.3. Java中常用API
String類
對字符串進行操作通常我們使用String類,相關的還有StringBuffer和StringBuilder
集合類
集合是一種容器,用來存取對象(Collection、Map)
包裝類
Java定義了一組包裝類對基本數據類型進行了包裝(Integer、Double、Boolean)
時間對象
Java定義了一些類方便用戶對時間、日期進行處理(Date、Calendar)
系統類
Java定義了一些類針對系統進行操作(System、Runtime)
IO流
Java定義了一些類對數據傳輸進行了封裝(輸入輸出流、File文件對象)
Socket
Java定義了一些類方便用戶進行網絡編程(Socket、DatagramSocket)
1.4. String對象的存儲
字符串是常量,一旦創建不能被修改。
字符串在程序中經常使用,虛擬機會將其緩存在String池中。
瞭解 String s = “abc” 和 String s = new String(“abc”) 的區別。
1.5. String類的構造函數
String(byte[] bytes)
通過指定字節數組構建字符串。
String(byte[] bytes, int offset, int length)
通過指定字節數組、數組元素偏移量和元素個數構建字符串。
String(byte[] bytes, String charsetName)
通過指定字節數組和指定碼錶構建字符串。
String(byte[] bytes, int offset, int length, String charsetName)
通過指定字節數組、數組元素偏移量、元素個數和指定碼錶構建字符串。
String(char[] value)
通過指定字符數組構建字符串。
String(char[] value, int offset, int count)
通過指定字符數組、數組元素偏移量和元素個數構建字符串。
String(StringBuffer buffer)
通過指定StringBuffer構建字符串。
String(StringBuilder builder)
通過指定StringBuffer構建字符串。
1.6. String類的常用方法
char charAt(int index)
查找指定位置的字符
int indexOf(String str)
判斷字符串出現的位置
int compareTo(String anotherString)
按字典順序比較兩個字符串
String substring(int beginIndex, int endIndex)
截取子字符串
String[] split(String regex)
字符分割
String replace(CharSequence target, CharSequence replacement)
替換字符串
Ø 字符串練習
設計一個方法, 獲取一個已知文件名的擴展名.
Person.java的擴展名是.java,Person.java.txt的擴展名是.txt
設計一個方法, 查找一個字符串中子字符串出現的所有位置.
“xxxabcxxxabcxxx”中abc出現了2次,索引位置是3和9
查找一個字符串中出現最多的字符.
“hello world”中L出現了3次
設計方法,使用System.in.read()讀取一行.
循環讀取一個字節,讀取到\r\n結束。考慮中文問題
已知一個字符串. 設計一個方法, 可以從這個字符串中打印n個字節. 但不能打印出半個中文.
短信一次發送字節140個,如果超過140字節就會分爲兩條。這時如果第140個字節是中文的前半,那麼第一條短信應該發送139字節。
查找兩個字符串中最大相同子串.
“abc”和“bcd”的最大相同子串是”bc”
“xyzabcdefxyz”和“xxxabcdefooo”的最大相同子串是”abcdef”
2. 集合類
2.1. 集合概念
Ø 爲什麼出現集合類?
在面向對象的編程思想中,都是以對象的形式對事物進行描述的,爲了保證對象的生命週期,我們需要持有對象
在很多情況下,我們不知道在程序中需要創建多少個對象,這時就不能依靠定義引用對象的變量來持有每一個對象
存儲對象的容器就能幫我們解決這樣的問題,而集合便是這樣的容器
Ø 數組和集合類的區別
數組和集合類都是容器,都能存儲對象
集合類的優勢就在於長度可變
Ø 集合類的特點
集合類可用於存儲對象
集合類的長度可變
一個集合可以存儲多種類型的對象
2.2. 集合接口
Ø Collection接口
一個獨立的元素的序列,這些元素服從一條或多條規則
Collection接口下主要分爲List集合和Set集合
List集合的特點是元素有序、允許有重複元素
Set集合的特點是元素無存儲順序、不允許有重複元素
Ø Map接口
一組成對的”鍵值對”對象,允許根據鍵來查找值
Map集合的鍵不允許有重複,所以Map的所有鍵構成了一個Set集合
主要學習HashMap和TreeMap
Ø Iterable接口
JDK1.5新定義的接口作爲Collection的父接口
主要爲了實現增強for循環
2.3. List
Ø List特點
元素有序,可重複。
我們主要學習三種:ArrayList、Vector、LinkedList
這三種都是List接口的實現類,使用上完全一樣,只是實現原理不同,效率不同。
Ø ArrayList
底層數組實現
查找快,增刪慢
線程不安全
Ø Vector
與ArrayList基本一樣
線程安全(線程同步),效率低
Ø LinkedList
底層鏈表實現
增刪塊,查找慢
Ø 存取元素
List集合元素存取方法一致
使用add()方法增加元素
由於List集合有序,可以使用get()方法獲取元素
元素的迭代(Iterator)
通過集合對象的iterator()方法獲得迭代器Iterator
通過Iterator迭代器的hasNext()方法判斷是否存在下一個元素
通過Iterator迭代器的next()方法獲取下一個元素
元素的迭代(Enumeration)
迭代Vector集合中的元素可以使用Enumeration
通過Enumeration的hasMoreElements()方法判斷是否還有元素
通過Enumeration的nextElement()方法返回下一個元素
2.4. JDK5新特性
Ø 泛型
由於集合可以存儲不同類型的數據,所以取元素時有可能會導致類型轉換錯誤
JDK1.5增加了新特性泛型,爲了減少操作集合時出錯的機率
集合一旦聲明瞭泛型,便只能存儲同一類型的對象了
使用方法:ArrayList<Person> al = new ArrayList<Person>();
使用泛型的好處
提高了程序的安全性
將運行期遇到的問題轉移到了編譯期
省去了類型強轉的麻煩
泛型類的出現優化了程序設計
Ø 增強for循環
新接口Iterable中定義了增強for循環
可以通過增強for循環對數組和集合進行遍歷
語法:for(類型 變量名 : 要遍歷的容器) { …… }
Ø 可變參數
有的時候在設計方法時無法確定將來別人會傳入的參數個數
JDK1.5增加了新特性可變參數,在函數中只聲明參數類型,不規定個數
方法接受的參數實際上是一個數組,可以在方法中遍歷數組
可變參數只能被定義爲函數的最後一個形參
語法格式: 返回值 函數名(參數類型… 形參名)
2.5. Set
Ø Set集合無序,不允許有重複元素
Set集合通過存入對象的equals方法來保證集合中沒有重複元素
Ø HashSet
HashSet是Set的子類,因此也沒有重複元素
底層使用哈希算法保證沒有重複元素
存儲對象時,先調用對象的hashCode()方法計算一個哈希值,在集合中查找是否有哈希值相同的對象。
如果沒有哈希值相同的對象,直接存入。
如果有哈希值相同的對象,則和哈希值相同的對象進行equals()方法比較。
equals()方法比較結果相同則不存,不同就存入。
往HashSet集合裏存儲的對象必須正確重寫hashCode和equals方法
Ø TreeSet
TreeSet集合通過二叉樹算法保證無重複元素,並對元素進行排序
在使用TreeSet時必須指定比較的算法,指定的方式有兩種:
自然順序:將要存儲的類實現Comparable接口,重寫compareTo方法,在方法中指定算法
比較器順序:在創建TreeSet時,傳入一個比較器Comparator,在比較器的compare方法中指定算法
2.6. Map
Ø Map集合的特點
Map存儲了一系列鍵值的映射關係
Map集合需要保證鍵的唯一性
可以通過鍵獲得值,反之則不能
Map集合存儲元素使用put(key,value)方法
Ø Map集合的兩種遍歷方式
通過keySet方法返回由鍵組成的集合,迭代該集合的元素就拿到了所有的鍵,再調用get方法根據鍵拿到值
通過entrySet方法返回鍵值映射關係組成的集合,迭代該集合就拿到了一個個的鍵值映射關係,通過getKey方法拿到鍵,通過getValue方法拿到值。
Ø HashMap
線程不安全,存取速度快,允許存放null鍵,null值。
通過HashSet原理保證鍵唯一性
Ø Hashtable
線程安全,速度慢,不允許存放null鍵,null值,已被HashMap替代。
Ø TreeMap
通過二叉樹算法保證鍵唯一性
對鍵進行排序,排序原理與TreeSet相同。
Ø Properties
HashTable的子類,所以也是線程安全的
用於讀寫配置文件的,一般配置項等號兩邊都是String,所以該集合中的兩列保存的都是String類型的數據
這個集合中只能存String,所以不需要定義泛型。
3. 其他常用類
3.1. 工具類
Ø Arrays
工具類,提供了對數組的常用操作
將數組轉成List集合
對數組進行排序
對數組進行二分查找
將數組轉爲字符串顯示形式
Ø Collections
工具類,提供了對集合的常用操作
對集合進行查找
取出集合中的最大值,最小值
對List集合進行排序
3.2. 包裝類
Ø JDK提供了對所有數據類型的包裝類
byte >>> Byte
short >>> Short
int >>> Integer
long >>> Long
double >>> Double
float >>> Float
char >>> Character
boolean >>> Boolean
Ø 包裝類的常用方法
toString方法
parseInt方法:Integer.parseInt(String s)
valueOf方法:Double.valueOf(String s)
3.3. 系統類
Ø System類
靜態屬性in爲標準輸入流,屬於InputStream類型,read方法返回一個字節
靜態屬性out爲標準打印流,屬於PrintStream類型,print方法打印字符
可以用set方法修改屬性in和out
System.exit()方法退出Java虛擬機
System.gc()垃圾回收
System.getProperties()方法獲得系統屬性
Ø Runtime類
表示系統運行時狀態
exec方法執行命令
3.4. 時間類
Ø Date類
使用new Date()創建時間對象代表當前系統時間
需要使用DateFormat類來進行格式化,才能顯示想符合習慣的格式
Ø Calendar類
使用該類對時間進行操作比較方便
通過常量來表示時間的各種值,如一年中的某一天,一個月的某一天等
將對應的常量作爲形參來調用相應的get、add、set方法來操作對象
Ø 練習
計算出某一年的二月份有多少天?
設計一個方法可以計算工作時間,接收一個參數(工作日),方法打印出哪天完工。
4. IO(Input Output)
4.1. IO流概念
IO流用來處理設備之間的數據傳輸
Java對數據的操作是通過流的方式
Java用於操作流的對象都在IO包中
流按操作對象分爲兩種:字節流與字符流。 字節流可以操作任何數據,字符流只能操作純字符數據比較方便。
流按流向分爲:輸入流,輸出流。
4.2. IO流常用基類
Ø 字節流的抽象基類:
InputStream ,OutputStream
Ø 字符流的抽象基類:
Reader , Writer
Ø 由這四個類派生出來的子類名稱都是以其父類名作爲子類名的後綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。
InputStreamReader是Reader的子類
4.3. IO程序書寫
使用前,導入IO包中的類
使用時,進行IO異常處理
使用後,釋放資源
4.4. 字符流讀寫文件
Ø 讀取文件
定義字符流關聯指定文件
FileReader reader = new FileReader("Test.txt");
讀取一個字符,返回int,該字符的碼錶值
int ch = reader.read();
關閉流,釋放資源
reader.close();
Ø 寫出文件
定義字符輸出流關聯指定文件
FileWriter writer = new FileWriter("Test.txt");
寫出一個字符,接收int碼錶值
writer.write(97);
關閉流,釋放資源
writer.close();
Ø 注意事項
文件路徑
定義文件路徑時Windows中的目錄符號爲“\”,但這個符號在Java中是特殊字符,需要轉義。
可以用“\\”或“/”表示。
讀取文件
讀取文件時必須保證文件存在,否則將拋出FileNotFoundException。
寫出文件
寫出時文件如不存在時程序會創建新文件,如文件已存在則會清空原文件內容重新寫入。
如需追加內容可調用FileWriter構造函數FileWriter(String fileName, boolean append)
練習
拷貝一個文件
4.5. 字符流緩衝區讀寫
Ø 自定義緩衝區讀寫
爲什麼定義緩衝區
由於單個字符讀寫需要頻繁操作文件,所以效率非常低。
我們可以定義緩衝區將要讀取或寫出的數據緩存,減少操作文件次數。
緩衝區讀取
先定義一個數組,然後調用FileReader讀取一個數組的方法。
int read(char[] cbuf)
緩衝區寫出
將要寫出的數據存放在數組中,調用FileWriter方法,一次寫出一個數組。
void write(char[] cbuf, int off, int len)
Ø 內置緩衝區的BufferedReader和BufferedWriter
Java提供了帶緩衝功能的Reader和Writer類:BufferedReader,BufferedWriter
這兩個類都是提供包裝功能,需要提供其他流來使用,給其他流增加緩衝功能
當我們調用BufferedReader讀取數據時,程序會從文件中一次讀取8192個字符用來緩衝
當我們調用BufferedWriter寫出數據時,程序會先將數據寫出到緩衝數組,直到寫滿8192個才一次性刷出到文件
4.6. 裝飾設計模式(Decorator)
Ø 什麼情況下使用裝飾設計模式
當我們需要對一個類的功能進行改進、增強的時候
Ø 裝飾模式的基本格式。
含有被裝飾類的引用
通過構造函數傳入被裝飾類對象
和被裝飾類含有同樣的方法,其中調用被裝飾類的方法,對其進行改進、增強
和被裝飾類繼承同一個類或實現同一個接口,可以當做被裝飾類來使用
Ø 瞭解BufferedReader、BufferedWriter的原理。
BufferedReader、BufferedWriter都是裝飾類,他們可以裝飾一個Reader或Writer,給被裝飾的Reader和Writer提供緩衝的功能。
就像我們用BufferedReader、BufferedWriter裝飾FileReader和FileWriter,使用的讀寫功能還是FileReader和FileWriter的,但給這兩個類的讀寫添加了緩衝功能。
Ø 練習
模擬一個BufferedReader類。
模擬一個LineNumberReader類。
4.7. 字節流
基本操作與字符流相同
字節流可以操作任意類型數據
練習:拷貝一個Jpg文件
4.8. 字節流緩衝區讀寫
Ø 自定義緩衝區讀寫
原理和字符流相同,都是爲了提高效率
定義數組緩衝數據,一次讀取一個數組,一次寫出一個數組,減少操作文件的次數
Ø BufferedInputStream、BufferedOutputStream
和BufferedReader、BufferedWriter原理相同,都是包裝類
BufferedInputStream、BufferedOutputStream包裝InputStream和OutputStream提供緩衝功能
4.9. 轉換流
字符流與字節流之間的橋樑
方便了字符流與字節流之間的操作
字節流中的數據都是字符時,轉成字符流操作更高效
練習:轉換System.in
4.10. 標準輸入輸出流
System類中的成員變量:in,out。
它們各代表了系統標準的輸入和輸出設備。
默認輸入設備是鍵盤,輸出設備是顯示器。
System.in的類型是InputStream.
System.out的類型是PrintStream是OutputStream的子類FilterOutputStream 的子類.
練習:通過修改標準輸入輸出流,使用System.in和System.out拷貝文件
4.11. 流基本應用小節
流是用來處理數據的。
處理數據時,一定要先明確數據源,或者數據目的地
數據源可以是文件,可以是鍵盤或者其他設備。
數據目的地可以是文件、顯示器或者其他設備。
而流只是在幫助數據進行傳輸,並對傳輸的數據進行處理,比如過濾處理、轉換處理等。
字符流
Reader
Writer
InputStreamReader
OutputStreamWriter
FileReader
FileWriter
BufferedReader
BufferedWriter
FileInputStream
字節流
FilterInputStream
FilterOutputStream
BufferedInputStream
BufferedOutputStream
InputStream
OutputStream
FileOutputStream
4.12. File類
用來將文件或者文件夾路徑封裝成對象
方便對文件與文件夾進行操作。
File對象可以作爲參數傳遞給流的構造函數。
瞭解File類中的常用方法。
4.13. 遞歸
函數自己調用自己。
注意:遞歸時一定要明確結束條件。
應用場景:
當某一功能要重複使用時。
練習:
列出一個文件夾下所有的子文件夾以及子文件
思考:
刪除一個目錄的過程是如何進行的?
複製一個目錄的過程呢?
4.14. IO包中的其他類
序列流
SequenceInputStream
可以將多個字節輸入流整合成一個流,在使用這個流讀取的時候,讀到第一個流的末尾時繼續讀第二個,第二個讀到末尾則繼續讀第三個,以此類推,直到讀到最後一個流的末尾返回-1
打印流
PrintStream 、PrintWriter
相比普通的OutputStream和Writer增加了print()和println()方法,這兩個方法可以輸出實參的toString()方法的返回值
這兩個類還提供自動flush()的功能
操作對象
ObjectOutputStream
可以將實現了Serializable的接口的對象轉成字節寫出到流中
ObjectInputStream
可以從流中讀取一個ObjectOutputStream流寫出的對象
操作內存緩衝數組
ByteArrayOutputStream: 寫出到字節數組(內存)中,可以獲取寫出的內容裝入一個字節數組。通常我們用這個流來緩衝數據。
ByteArrayInputStream:可以從一個字節數組中讀取字節。
CharArrayWriter:寫出字符到字符數組(內存)中,可以獲取寫出的內容裝入一個字符數組。
CharArrayReader:可以從一個字符數組中讀取字符。
管道流
PipedInputStream:管道輸入流,可以從管道輸出流中讀取數據
PipedOutputStream:管道輸出流,可以向管道輸入流中寫出數據
操作基本數據類型
DataInputStream、DataOutputStream
可以按照基本數據類型佔用空間大小讀寫數據
隨機訪問文件
RandomAccessFile
5. 多線程
5.1. 多線程概念
Ø 線程與進程
進程就是一個運行中的程序。
一個進程中可以有多個線程,線程是CPU調度和分派的基本單位。我們可以理解爲線程就是程序運行中的一條路徑。
Ø 多線程存在的意義
允許多個線程併發執行,提高程序運行效率。
例如:迅雷多線程下載,QQ多個人同時聊天,凌波多個人同時共享屏幕。
5.2. 線程的使用
Ø 創建線程有兩種方式
自定義一個類繼承Thread類,將線程要做的事寫在run()方法中,由於子類可以當父類來用,創建自定義子類對象就是創建了一個線程。
自定義一個類實現Runnable接口,將要做的事寫在run()方法中。創建Thread對象時在構造函數中傳入Runnable實現類對象。
Ø 線程的啓動
兩種創建方式都是調用Thread對象的start()方法。
當調用start()方法時,CPU會開啓一條新線程,並在新線程上執行run()方法。
Ø 線程常用方法
currentThread
靜態方法,用來獲取當前線程
getName、setName
用來獲取、設置當前線程的名字
sleep
控制線程休眠,單位爲毫秒
setDeamon
將線程設置爲守護線程。線程默認是非守護線程,守護線程不能單獨執行。
join
當前線程暫停,等待加入的線程運行結束,當前線程繼續執行。
5.3. 多線程同步
Ø 線程安全問題
多線程併發訪問同一數據,有可能出現線程安全問題。
一條線程的訪問還沒有結束,CPU切換到另一條線程工作,導致數據訪問出錯。
Ø 使用同步解決線程安全問題
使用同步代碼塊synchronized(鎖對象){需要同步的代碼...}形式將訪問數據的代碼鎖住,在同步代碼塊中的內容同一時間內只能一個線程執行。
使用同步方法,用synchronized修飾方法,整個方法的代碼都是同步的,只能一個線程運行。同步方法使用this作爲鎖。
Ø 死鎖
在多個線程併發執行使用多個鎖來同步時,有可能互相沖突,導致程序無法繼續執行。
Ø 同步的優點與缺點
同步可以解決多個線程同時訪問一個共享數據的問題,只要加上同一個鎖,在同一時間內只能有一條線程執行。
在執行同步代碼時每次都會判斷鎖,非常消耗資源,效率較低。
5.4. 多線程通信
在同步代碼中可以使用鎖對象的wait()方法讓當前線程等待
使用鎖對象的notify()方法可以將正在等待的線程喚醒
如果多個線程都在等待,notify()喚醒隨機1個
notifyAll()方法可以喚醒所有在等待的線程
5.5. JDK5之後的線程同步與通信
Ø 同步
使用java.util.concurrent.locks.Lock接口的實現類對象來進行同步
ReentrantLock就是Lock的實現類,可以實現synchronized的功能
在需要同步的代碼塊前後使用lock()和unlock()方法來完成同步
unlock()最好放在finally中,因爲如果上面代碼拋出異常沒有解鎖的話,會導致其他線程無法運行,程序卡死。
Ø 通信
使用Lock對象的newCondition()方法獲取一個Condition對象,Condition對象可以控制指定線程的等待與喚醒。
await()方法可以控制線程等待。
signal()方法可以喚醒等待的線程。
signalAll()方法可以喚醒所有等待線程。
6. GUI
6.1. GUI概念
Ø 什麼是GUI
GUI是Graphical User Interface的縮寫,圖形化用戶界面
Ø awt和swing
Java爲GUI提供的對象都存在java.awt,javax.swing兩個包中
awt依賴於本地系統平臺,如顏色樣式顯示
swing跨平臺
Ø 組件與容器
組件 Component,是GUI圖形界面的組成單元。
容器Container,可以存放組件,也可以存放容器。
6.2. 佈局管理
Ø FlowLayout(流式佈局管理器)
從左到右的順序排列。
Ø BorderLayout(邊界佈局管理器)
東,南,西,北,中
Ø GridLayout(網格佈局管理器)
規則的矩陣
Ø CardLayout(卡片佈局管理器)
選項卡
Ø GridBagLayout(網格包佈局管理器)
非規則的矩陣
6.3. 建立一個窗體
窗體中可以存放各種組件,所以窗體是容器Container。創建時我們使用的是它的子類
Container的常用子類有兩個,Window和Panel。Window是我們常用的窗體,Panel是用來佈局的不可見的。
Window也有兩個常用子類,Frame和Dialog。Frame是我們常用的帶有標題和邊框的頂層窗口,Dialog是對話框。
所有AWT包中的類都會運行在AWT線程上
6.4. 事件處理
Ø 事件處理機制
事件:用戶對組件的一個操作。
事件源:發生事件的組件。
監聽器:我們需要處理某個事件,就需要在發生事件的組件上添加監聽器,也就是java.awt.event包中XxxListener接口的子類。
事件處理器:監聽器中的方法。監聽器被添加在組件上之後,組件上發生了對應事件就會執行指定方法。
Ø 常用事件分類
窗體事件,WindowEvent,窗體打開、關閉、正在關閉、激活、最小化等。
鼠標事件,MouseEvent,鼠標按下、擡起、進入、移出等。
鍵盤事件,KeyEvent,鍵盤按下、擡起等。
動作事件,ActionEvent,在某一組件上發生了定義好的動作,例如按鈕上鼠標點擊或按空格,菜單上鼠標點擊或按回車等。
7. Socket網絡編程
7.1. 網絡編程概念
Ø IP地址
每臺網絡終端在網絡中都有一個獨立的地址,我們在網絡中傳輸數據就是使用這個地址。
ipconfig:查看本機IP
ping:測試連接
本地迴路地址:127.0.0.1
IPv4:4個字節組成,4個0-255。大概42億,30億都在北美,亞洲4億。已經用盡。
IPv6:8組,每組4個16進制數。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f
Ø 端口號
每個網絡程序都需要綁定一個端口號,傳輸數據的時候除了確定發到哪臺機器上,還要明確發到哪個程序。
端口號範圍從0-65535
編寫網絡應用就需要綁定一個端口號,儘量使用1024以上的,1024以下的基本上都被系統程序佔用了。
常用端口
mysql: 3306
oracle: 1521
web: 80
tomcat: 8080
QQ: 4000
feiQ: 2425
Ø 網絡協議
爲計算機網絡中進行數據交換而建立的規則、標準或約定的集合。
UDP
面向無連接,數據不安全,速度快。不區分客戶端與服務端。
TCP
面向連接(三次握手),數據安全,速度略低。分爲客戶端和服務端。
Ø Socket
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO傳輸。
Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IP和port。
7.2. UDP傳輸
Ø 發送
創建DatagramSocket
創建DatagramPacket
使用DatagramSocket發送DatagramPacket
關閉DatagramSocket
Ø 接收
創建DatagramSocket
創建DatagramPacket
使用DatagramSocket接收DatagramPacket
關閉DatagramSocket
7.3. TCP傳輸
Ø 客戶端
創建Socket連接服務端
調用Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的管道流
輸入流可以讀取服務端輸出流寫出的數據
輸出流可以寫出數據到服務端的輸入流
Ø 服務端
創建ServerSocket
調用ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的管道流
輸入流可以讀取客戶端輸出流寫出的數據
輸出流可以寫出數據到客戶端的輸入流