簡(jiǎn)單介紹Java 網(wǎng)絡(luò)程序
網(wǎng)絡(luò)程序,一般是指帶網(wǎng)絡(luò)接連或需要網(wǎng)絡(luò)接連才能使用的或能脫機(jī)和聯(lián)機(jī)使用的新型智能程序。Java在網(wǎng)絡(luò)編程這個(gè)地方做的很好,java的主要目的也是為了網(wǎng)絡(luò)而生的,它能方便的訪問(wèn)網(wǎng)絡(luò)上的資源。我們這節(jié)課來(lái)介紹網(wǎng)絡(luò)通訊的兩種機(jī)制:URL通信機(jī)制,Socket通信機(jī)制。
URL表示了Internet上一個(gè)資源的引用或地址。Java網(wǎng)絡(luò)應(yīng)用程序也是使用URL來(lái)定位要訪問(wèn)的Internet的資源。在jdk里面java.net.URL也是一個(gè)類,它來(lái)封裝URL的一些細(xì)節(jié)。目前大家可以把URL理解為網(wǎng)址,http://www.100jq.com/default.aspx 這就是個(gè)URL。http是協(xié)議名(超文本傳輸協(xié)議)用“://”隔開(kāi)www.100jq.com 是主機(jī)名。Default.aspx是文件名。它的端口號(hào)沒(méi)有寫,默認(rèn)是80。
實(shí)踐:
- 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("協(xié)議是 "+url.getProtocol());
- System.out.println("主機(jī)是 "+url.getHost());
- System.out.println("文件名是 "+url.getFile());
- System.out.println("端口號(hào)是 "+url.getPort());
- }}
- /*
- URL這個(gè)對(duì)象中提供了很多方法像是
- getProtocol()
- getHost()
- getFile()
- getPort()
- */
我們可以通過(guò)URL對(duì)文件或資源讀取,也可以通過(guò)URLConnection讀取,也可以通過(guò)這個(gè)寫入數(shù)據(jù)限于cgi腳本。
實(shí)踐:
- import java.net.*;
- import java.io.*;
- public class URLConnectionReader {
- public static void main(String[] args) throws IOException {
- URL google = new URL("http://www.100jq.com/");
- 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類提供了較高層次的網(wǎng)絡(luò)訪問(wèn)。有時(shí)候需要進(jìn)行較低層次的訪問(wèn)。編寫C/S模型的程序時(shí),就要使用Socket通信機(jī)制了。因?yàn)樵诰W(wǎng)絡(luò)上不一定非得訪問(wèn)文件。
實(shí)踐:
- //先寫個(gè)客戶端的應(yīng)用
- import java.net.*;
- import java.io.*;
- public class SimpleClient {
- public static void main(String args[]) {
- try {
- // 在5432端口打開(kāi)服務(wù)器連接
- // 在這里用localhost與127.0.0.1是一個(gè)意思
- Socket s1 = new Socket("127.0.0.1", 5432);
- // 對(duì)這個(gè)端口連接一個(gè)reader,注意端口不能夠占用別的
- BufferedReader br = new BufferedReader(
- new InputStreamReader(s1.getInputStream()));
- // 讀取輸入的數(shù)據(jù)并且打印在屏幕上
- System.out.println(br.readLine());
- //當(dāng)完成時(shí)關(guān)閉流和連接
- br.close();
- s1.close();
- } catch (ConnectException connExc) {
- System.err.println("Could not connect to the server.");
- } catch (IOException e) {
- // ignore
- }}}
- //這是服務(wù)端的應(yīng)用
- import java.net.*;
- import java.io.*;
- public class SimpleServer {
- public static void main(String args[]) {
- ServerSocket s = null;
- // 注冊(cè)服務(wù)端口為5432
- try {
- s = new ServerSocket(5432);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 運(yùn)行監(jiān)聽(tīng)器并接收,永遠(yuǎn)循環(huán)下去。因?yàn)榉?wù)器總要開(kāi)啟的
- while (true) {
- try {
- // 等待一個(gè)連接的請(qǐng)求
- Socket s1 = s.accept();
- // 得到端口的輸出流
- OutputStream s1out = s1.getOutputStream();
- BufferedWriter bw = new BufferedWriter(
- new OutputStreamWriter(s1out));
- // 發(fā)送一個(gè)字符串
- bw.write("百家拳軟件項(xiàng)目研究室歡迎您!/n");
- // 關(guān)閉這個(gè)連接, 但不是服務(wù)端的socket
- bw.close();
- s1.close();
- } catch (IOException e) {
- e.printStackTrace();
- }}}}
執(zhí)行這個(gè)程序和其它的不太一樣,先用javac將兩個(gè)文件編譯之后。然后敲start開(kāi)啟另一個(gè)窗口。用start命令開(kāi)啟的窗口繼承了原來(lái)窗口的特性。
接著在原來(lái)的窗口上執(zhí)行服務(wù)端程序java SimpleServer.在新窗口中執(zhí)行java SimpleClient 就會(huì)看到結(jié)果了。注意如果如果在啟動(dòng)服務(wù)端的時(shí)候拋出bindException則說(shuō)明5432這個(gè)端口已經(jīng)被別的程序占用著,改成別的端口號(hào)就可以了。通常選用端口的時(shí)候,其數(shù)字最好不要小于1024,1024一下的端口很多都是專用的端口。
希望通過(guò)本文的介紹,能給你帶來(lái)幫助。
【編輯推薦】