java在網絡編程這個地方做的很好,java的主要目的也是為了網絡而生的,它能方便的訪問網絡上的資源。我們這節課來介紹網絡通訊的兩種機制:URL通信機制,Socket通信機制。
URL表示了Internet上一個資源的引用或地址。java網絡應用程序也是使用URL來定位要訪問的Internet的資源。在jdk里面java.net.URL也是一個類,它來封裝URL的一些細節。目前大家可以把URL理解為網址,default.aspx 這就是個URL。http是協議名(超文本傳輸協議)用“://”隔開www.100jq.com 是主機名。Default.aspx是文件名。它的端口號沒有寫,默認是80。
實踐:
import java.net.*;
public class ParseURL {
public static void main(String[] args) throws MalformedURLException{
URL url = new URL("http://www.100jq.com:45175/default.aspx");
System.out.println("協議是 "+url.getProtocol());
System.out.println("主機是 "+url.getHost());
System.out.println("文件名是 "+url.getFile());
System.out.println("端口號是 "+url.getPort());
}}
/*
URL這個對象中提供了很多方法像是
getProtocol()
getHost()
getFile()
getPort()
*/
我們可以通過URL對文件或資源讀取,也可以通過URLConnection讀取,也可以通過這個寫入數據限于cgi腳本。
實踐:
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String[] args) throws IOException {
URL google = new URL("");
URLConnection g = google.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(g.getInputStream()));
String inputLine;
while ((inputLine=in.readLine())!=null)
System.out.println(inputLine);
in.close();
}}
URL和URLConnection類提供了較高層次的網絡訪問。有時候需要進行較低層次的訪問。編寫C/S模型的程序時,就要使用Socket通信機制了。因為在網絡上不一定非得訪問文件。
實踐://先寫個客戶端的應用
import java.net.*;
import java.io.*;
public class SimpleClient {
public static void main(String args[]) {
try {
// 在5432端口打開服務器連接
// 在這里用localhost與127.0.0.1是一個意思
Socket s1 = new Socket("127.0.0.1", 5432);
// 對這個端口連接一個reader,注意端口不能夠占用別的
BufferedReader br = new BufferedReader(
new InputStreamReader(s1.getInputStream()));
// 讀取輸入的數據并且打印在屏幕上
System.out.println(br.readLine());
//當完成時關閉流和連接
br.close();
s1.close();
} catch (ConnectException connExc) {
System.err.println("Could not connect to the server.");
} catch (IOException e) {
// ignore
}}}
//這是服務端的應用
import java.net.*;
import java.io.*;
public class SimpleServer {
public static void main(String args[]) {
ServerSocket s = null;
// 注冊服務端口為5432
try {
s = new ServerSocket(5432);
} catch (IOException e) {
e.printStackTrace();
}
// 運行監聽器并接收,永遠循環下去。因為服務器總要開啟的
while (true) {
try {
// 等待一個連接的請求
Socket s1 = s.accept();
// 得到端口的輸出流
OutputStream s1out = s1.getOutputStream();
Bufferedwriter bw = new Bufferedwriter(
new OutputStreamWriter(s1out));
// 發送一個字符串
bw.write("百家拳軟件項目研究室歡迎您!\n");
// 關閉這個連接, 但不是服務端的socket
bw.close();
s1.close();
} catch (IOException e) {
e.printStackTrace();
}}}}上述例子打包下載
執行這個程序和其它的不太一樣,先用javac將兩個文件編譯之后。然后敲start開啟另一個窗口。用start命令開啟的窗口繼承了原來窗口的特性。如圖26-1所示
圖26-1
接著在原來的窗口上執行服務端程序java SimpleServer.在新窗口中執行java SimpleClient 就會看到結果了。注意如果如果在啟動服務端的時候拋出bindException則說明5432這個端口已經被別的程序占用著,改成別的端口號就可以了。通常選用端口的時候,其數字最好不要小于1024,1024一下的端口很多都是專用的端口。