Java網路編程(一)- 一個簡單的服務端/用戶端應用程式

來源:互聯網
上載者:User

在Java中,我們使用java.net.Socket及其相關類來完成有關網路的相關功能。Socket類非常簡單易用,因為Java技術隱藏了建立網路連接和通過串連發送資料的複雜過程。下面所說的內容只適用於TCP協議。

一、串連到伺服器

我們可以使用Socket類的建構函式來開啟一個通訊端,如

Socket sk = new Socket("210.0.235.14",13);

其中,210.0.235.14是一個點分十進位的String對象,表示目的主機的IP地址(或主機名稱), 13表示指定串連目標主機的13連接埠。這裡的210.0.235.14是位於香港的一個授時伺服器,授時伺服器預設的連接埠一般都為13.

注意,在成功串連到伺服器之前,程式會阻塞。

接下來可以使用Socket類的getInputStream()方法來得到一個InputStream對象,通過這個對象就可以擷取到目標主機給我們發過來的資訊:

InputStream inStream = sk.getInputStream();

同理,要向目標主機發送資料,則可以調用getOutputStream()方法來擷取一個輸出資料流對象。

下面的例子功能是串連授時伺服器,並將返回的資訊列印到標準輸出中:

try{Socket sk = new Socket("210.0.235.14",13);sk.setSoTimeout(3000);InputStream inStream = sk.getInputStream(); //得到輸入資料流對象Scanner sc = new Scanner(inStream);//將資料列印到控制台while(sc.hasNextLine()){String str = sc.nextLine();System.out.println("Output : " + str);}sk.close();}catch(SocketTimeoutException e) //逾時異常{System.out.println("Time Out!");}catch(Exception e){e.printStackTrace();}

代碼中setSoTimeout()方法可以設定逾時時間,即如果超過了設定時間還沒有完成讀寫操作,則會拋出SocketTimeoutException,可以通過捕獲這個異常來關閉串連。

另外還有一個逾時問題是必須要解決的,就是這個Socket類的建構函式

new Socket(host,port);

會一直無限地阻塞下去,直到成功建立了到目標主機的串連為止。這當然不是我們所希望的。我們可以通過如下調用方式解決此問題:

Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000); //設定逾時時間為2秒

二、擷取主機地址

InetAddress類的靜態方法getByName(hostname)可以返回代表了某個主機地址的InetAddress對象,這個對象封閉了一個4位元組的序列,即主機的IP地址。然後再調用getHostAddress()方法返回一個表示IP地址的String對象.

一些訪問量大的主機名稱通常會對應著多個IP地址以實現負載平衡。我們可以調用getAllByName()方法來獲得所有主機地址,該方法返回一個InetAddress對象的數組。

下面是一個簡單的小程式,實現的功能是,如果不在命令列中設定參數,就列印出本地的IP地址,如果指定了主機名稱,則列印出該主機所有的IP地址:

package cls;import java.net.*;public class ShowIP{public static void main(String[] args){try{if(args.length > 0){String hostName = args[0]; //主機名稱InetAddress[] addr = InetAddress.getAllByName(hostName); //得到該主機的所有地址//列印輸出至控制台for(InetAddress address : addr){System.out.println(address.getHostAddress());}}else{System.out.println(InetAddress.getLocalHost().getHostAddress());}}catch(Exception e){e.printStackTrace();}}}

三、伺服器端程式

伺服器端應用程式使用ServerSocket類來建立通訊端,並鈄其綁定至本地連接埠中,如

ServerSocket sock = new ServerSocker(8000);

sock.accept()方法讓程式不停地等待串連,該方法只有當有用戶端串連時才會返回一個代表了新串連的Socket對象,即該方法會發生阻塞。

這裡一般要為每個串連新開啟一個線程為其服務。

下面是一個完整的例子,服務端在8400連接埠處等待串連,每當串連到來時,新開一個線程為其服務,並將串連資訊寫入的記錄檔中:

package cls;import java.io.*;import java.net.*;import java.util.*;public class ServerDemo{/** * @param args */public static void main(String[] args){try{//ServerSocket servSocket = new ServerSocket(8000);ServerSocket servSocket = new ServerSocket(8400);int amount = 0;while(true){Socket client = servSocket.accept();++amount;Date time = new Date();String prompt = time.toString() + ": 第" + amount + "個使用者 " + client.getInetAddress().getHostAddress() + " 已串連\n";System.out.print(prompt); //在控制台輸出資訊ServerDemo.writeLog(prompt); //寫入到檔案中//start a new ThreadThread th = new Thread(new ServThread(client,amount));th.start();}}catch(Exception e){e.printStackTrace();}}//寫入記錄檔public static void writeLog(String str){File logFile = new File("server-log.txt");try{FileWriter out = new FileWriter(logFile,true);out.append(str);out.close();}catch(Exception e){e.printStackTrace();}}}/* * 服務線程類 */class ServThread implements Runnable{private Socket client;private int ix;public ServThread(Socket soc,int ix){client = soc;this.ix = ix;}public void run(){try{InputStream inStream = client.getInputStream();OutputStream outStream = client.getOutputStream();Scanner recv = new Scanner(inStream);PrintWriter send = new PrintWriter(outStream,true);send.println("歡迎~隨便聊幾句吧![輸入'bye'關閉聯結]");while(recv.hasNextLine()){String str = recv.nextLine();if(str.equals("bye")){send.println("See you later ~ ^-^");break;}send.println("這是個測試程式,現在還沒有什麼功能哦");}Date time = new Date();String prompt = time.toString() + ": 第" + ix + "個使用者 " + client.getInetAddress().getHostAddress() + " 已中斷連線\n";System.out.print(prompt);ServerDemo.writeLog(prompt); //寫入到檔案中client.close();}catch(Exception e){e.printStackTrace();}}}

這個程式已經被放到了伺服器上,大家可以使用telnet youthol.tk 8400 命令來體驗一下這個程式的運行結果。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.