JAVA 網路程式設計基礎
JAVA 網路程式設計基礎
一,前言
瞭解計算機網路的概述,掌握Sokcet類程式設計,ServerSocket類,Socket類的構造方法和常用方法
二,計算機網咯
1.概述
計算機網路計算機們組成的網路,同一個網路中,計算機可以直接通訊,因為計算機都需遵循同一種網路協議。
網際網路是網路的網路(internet),即把很多計算機網路連線起來,形成一個全球統一的網際網路。
某個計算機網路,可能使用網路協議ABC,而另一個可能使用網路協議XYZ。如通訊協議不統一,則無法連線形成網際網路。統一使用TCP/IP協議。
TCP/IP協議:
泛指網際網路協議,其中最重要的兩個協議是TCP協議和IP協議。只有使用TCP/IP協議的計算機才能夠聯入網際網路,使用其他網路協議(例如NetBIOS、AppleTalk協議等)是無法聯入網際網路的。
2.IP地址
在網際網路中,一個IP地址用於唯一標識一個網路介面(Network Interface)。一臺聯入網際網路的計算機至少有一個IP地址,或多個IP地址。
IP地址分為IPv4和IPv6兩種。
- IPv4
IPv4採用32位地址,類似101.202.99.12,IPv4地址總共有232個(大約42億),IPv4的地址目前已耗盡。
- IPv6
而IPv6採用128位地址,類似2001:0DA8:100A:0000:0000:1020:F2F3:1428,IPv6地址則總共有2128個(大約340萬億億億億),而IPv6的地址是根本用不完的。
有一個特殊的IP地址,稱之為本機地址,它總是:127.0.0.1(localhost)。
3.域名
直接記憶IP地址困難,通常使用域名訪問某個特定的服務。域名解析伺服器DNS負責把域名翻譯成對應的IP,客戶端再根據IP地址訪問伺服器。
在cmd中用nslookup可以檢視域名對應的IP地址
有一個特殊的本機域名localhost
4.常用協議
TCP協議:
是應用最廣泛的協議,許多高階協議都是建立在TCP協議之上的,例如HTTP、SMTP等。
UDP協議(User Datagram Protocol):
是一種資料報文協議,它是無連線協議,不保證可靠傳輸。
三,TCP程式設計
在開發網路應用程式的時候,我們又會遇到Socket這個概念。
Socket、TCP和部分IP的功能都是由作業系統提供的,不同的程式語言只是提供了對作業系統呼叫的簡單的封裝。
Socket就是由IP地址和埠號(範圍是0~65535)組成,可以把Socket簡單理解為IP地址加埠號。
埠號由作業系統分配,特權埠(小於1024)需管理員許可權,普通埠(大於1024)任意使用者的應用程式開啟。
比如mysql埠: 127.0.0.1:3306
四,Socket程式設計
Java提供的網路類庫(java.net),可以實現無縫的網路連線
使用Socket進行網路程式設計時,本質上就是兩個程序之間的網路通訊。
一個程序伺服器端,它會主動監聽某個指定的埠。一個客戶端,它必須主動連線伺服器的IP地址和指定埠,如果連線成功,伺服器端和客戶端就成功地建立了一個TCP連線,雙方後續就可以隨時傳送和接收資料。
1.ServerSocket類
構造方法:
//建立繫結到指定埠的伺服器套接字。
ServerSocket(int port)
常用方法:
Socket accept() throws IOException
//等待客戶端的連線請求,返回與該客戶端進行通訊用的Socket物件
void setSoTimeout(int timeout) throws SocketException
//設定accept()方法等待連線的時間為timeout毫秒。若時間已到,還沒有客戶端連線,則丟擲InterruptedIOException異常,accept()方法不再阻塞,該傾聽Socket可繼續使用。若timeout值為0,則表示accept()永遠等待。該方法必須在傾聽Socket建立後,在accept()之前呼叫才有效。
void close()throws IOException
//關閉監聽Socket
InetAddress getInetAddress()
//返回此伺服器套接字的本地地址
int getLocalPort()
//返回此套接字在其上監聽的埠號
SocketAddress getLocalSocketAddress()
//返回此套接字繫結的端點的地址
2.sokect類
構造方法:
//建立流套接字並將其連線到指定IP地址的指定埠號。
Socket(InetAddress address, int port)
常用方法:
InetAddress getLocalAddress()
//返回對方Socket中的IP的InetAddress物件
int getLocalPort()
//返回本地Socket中的埠號
InetAddress getInetAddress()
//返回對方Socket中IP地址
int getPort()
//返回對方Socket中的埠號
void close() throws IOException
//關閉Socket,釋放資源
InputStream getInputStream() throws IOException
//獲取與Socket相關聯的位元組輸入流,用於從Socket中讀資料。
OutputStream getOutputStream() throws IOException
//獲取與Socket相關聯的位元組輸出流,用於向Socket中寫資料。
五,Socket實現客戶端和服務端通訊
例:
- 服務端程式碼
public class FuWuDuan {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
InputStream is = null;
OutputStream os = null;
Scanner sc = null;
try {
ss = new ServerSocket(1314);
sc= new Scanner(System.in);
while (true) {
//建立監聽,接受客服端請求
s = ss.accept();
is = s.getInputStream();
//讀寫客戶端的請求
byte b[] = new byte[1024];
is.read(b);
System.out.println("服務端收到:"+new String(b));
//輸出請求,發生客戶端
os = s.getOutputStream();
System.out.println("服務端請發出:");
String str = sc.next();
byte b1[] = str.getBytes();
os.write(b1);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//關流
}
}
}
- 客戶端程式碼
public static void main(String[] args) {
Socket s = null;
OutputStream os = null;
Scanner sc = null;
InputStream is = null;
+
try {
//建立連線,連線服務端
sc= new Scanner(System.in);
while (true) {
s = new Socket("192.168.2.88", 1314);
//輸出請求,發生服務端
os = s.getOutputStream();
System.out.println("客服端請發出:");
String str = sc.next();
byte b[] = str.getBytes();
os.write(b);
os.flush();
is = s.getInputStream();
//讀寫服務端的請求
byte b1[] = new byte[1024];
is.read(b);
System.out.println("客服端收到:"+new String(b));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//關流
}
}
}