java初學者實踐教程-網絡程序
Java在網絡編程這個地方做的很好,java的主要目的也是為了網絡而生的,它能方便的訪問網絡上的資源。我們這節課來介紹網絡通訊的兩種機制:URL通信機制,Socket通信機制。URL表示了Internet上一個資源的引用或地址。Java網絡應用程序也是使用URL來定位要訪問的Internet的資源。在jdk里面java.net.URL也是一個類,它來封裝URL的一些細節。目前大家可以把URL理解為網址,default.aspx 這就是個URL.http是協議名(超文本傳輸協議)用“://”隔開www.tbwshc.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對文件或資源讀取,tb也可以通過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(); }}}} |
下載 target=_blank>上述例子打包下載
執行這個程序和其它的不太一樣,先用javac將兩個文件編譯之后。然后敲start開啟另一個窗口。用start命令開啟的窗口繼承了原來窗口的特性。如圖26-1所示
圖26-1
接著在原來的窗口上執行服務端程序java SimpleServer.在新窗口中執行java SimpleClient 就會看到結果了。注意如果如果在啟動服務端的時候拋出bindException則說明5432這個端口已經被別的程序占用著,改成別的端口號就可以了。通常選用端口的時候,其數字最好不要小于1024,1024一下的端口很多都是專用的端口。