網絡編程:
網絡基礎知識
Mac地址:每個網卡專用地址,也是唯一的。
端口(port):應用程序(進程)的標識(網絡通信程序)
OS中可以有65536(2^16)個端口,進程通過端口交換數據。
端口是一種抽象的軟件結構,與協議相關:TCP的23端口和UDT的23端口爲兩個不同的概念。
端口應該用1024以上的端口,以下的端口都已經設定功能。
協議:爲了進行網絡中的數據交換而建立的約定,協議是爲了保證通信的安全,不同層的協議是完全不同的。
TCP協議:傳輸層的協議,重發一切錯誤的信息
IP協議:保證地址和主機一一對應(ip地址+網卡地址)
TCP編程:
TCP是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。發送方和接收方的成對的兩個socket之間必須建立連接,以便在TCP協議的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接時,另一個socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發送或接收操作。
1) 服務器分配一個端口號,服務器使用accept()方法等待客戶端的信號,信號一到打開socket連接,從socket中取得OutputStream和InputStream。
2) 客戶端提供主機地址和端口號使用socket端口建立連接,得到OutputStream和InputStream。
Server端編碼的步驟:
1、new ServerSocket 打開端口
2、調ServerSocket的accept()等待客戶連接,當連接成功返回交互的Socket。
3、調用Socket.getInputStream,getOutputStream獲得服務器端的IO流
4、用處理流封裝後與客戶端交互,記住你讀我寫,一讀一寫。
5、關閉單一客戶端調用Socket的close(),關閉服務器調ServerSocket的close();
Socket端編碼步驟:
1、new Socket(Server ip,Server port)試圖連接,如成功纔有對象
2、調用Socket.getInputStream,getOutputStream獲得服務器端的IO流
3、用處理流封裝後與客戶端交互,記住你讀我寫,一讀一寫。
4、關閉,只有Socket的close()方法。
多線程+網絡:
1、服務器端的等待客戶連接代碼( while(true) ),服務器端與單個客戶端交互的代碼放入線程體( run )
2、客戶端如有其他要求,與服務器交互的代碼也要放入線程體
3、ServerSocket和Socket編碼基於TCP/IP協議,重發一切錯誤數據,當網絡不好時會使性能很差
4、Server端
new ServerSocket啓動等待連接線程
在accept後啓動交互線程
注意:交互時注意對應產生,讀寫流對應和次數對應
URL:網址,統一資源定位器
常用的構造器:
URL(String spec)
spec 一個完整的網址(協議+網址)
根據 String 表示形式創建 URL 對象。
URLConnection:與網址進行連接
通過URL的openConnection()方法生成一個URLConnection實例,通過下面兩個方法,進行流的操作
getInputStream()
返回從此打開的連接讀取的輸入流
getOutputStream()
返回寫入到此連接的輸出流。
UDP編程:這種信息傳輸方式相當於傳真,信息打包,在接收端準備紙
特點:
1、一種無連接協議,速度快
2、不保證數據的完整,不會進行重發
DatagramSocket和DatagramPacket類:
DatagramSocket:此類表示用來發送和接收數據報包的套接字。
DatagramPacket:數據報包,是UDP下進行傳輸數據的單位,數據存放在字節數組中,其中包括了目標地址和端口以及傳送的信息。
用於接收:
DatagramPacket(byte[] buf , int length)
用於發送:
DatagramPacket(byte[] buf , int length , InetAddress address , int port )
UDP發送端:
1、創建一個DatagramSocket,不需要參數
2、創建一個DatagramPacket,指明接收方的IP地址和端口號
3、發送數據send(DatagramPacket p)
4、關閉DatagramSocket
UDP接收端:
1、創建一個DatagramSocket,指定接收方的IP地址和端口號
2、創建一個DatagramPacket,不需要IP地址和端口號
3、接收數據receive(DatagramPacket p)
4、關閉DatagramSocket
常用類庫:
java.lang.*:
System 系統
Object 對象
clone()
equals()
hashCode()
toString()
Class 類
String/StringBuffer/StringBuilder 與字符串相關的
Thread 線程
所有的封裝類
java.util.*:
Set--->HashSet,TreeSet
List--->ArrayList
Map--->HashMap(線程安全,不支持空),HashTable(線程不安全,支持空)
Collections--->外同步
Properties
Date
觀察者-->Observable,接口Observer
數據結構+工具類
java.sql.*: 後面馬上會講到,JDBC
java.awt/swing.*:沒什麼機會用到
java.io.*: 流相當的多
File/FilenameFilter
Serializable 對象序列化接口
注意:寫一個類要考慮的事情:1、無參構造器,2、實現序列化接口,3、重寫equals,hashCode
FileInputStream
FileOutputStream
InputStreamReader
PrintStream
BufferedReader
nio包
java.net.*: 以後JSP,Servlet用的時候這個包都已經寫好了
InetAddress--->IP地址
URL----------->網址
URLConnection---->連接
ServerSocket,Socket----TCP/IP
DatagramSocket,DatagramPacket----UDP
一些零散的類:
Comparable(可比較的),Comparator(比較器)
java.math.*;數字在商業軟件中應用時找這個包
BigDecimal
與反射相關的:java.lang.reflect: 用的機會比較少
Runtime(運行環境),Process(進程) ,這兩個在java.lang包裏,用了這些就不能跨平臺了,而且效率低