Java收集編程之簡略的辦事端客戶端運用實例。本站提示廣大學習愛好者:(Java收集編程之簡略的辦事端客戶端運用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java收集編程之簡略的辦事端客戶端運用實例正文
本文實例講述了Java收集編程之簡略的辦事端客戶端運用。分享給年夜家供年夜家參考。詳細以下:
在Java中,我們應用java.net.Socket及其相干類來完成有關收集的相干功效。Socket類異常簡略易用,由於Java技巧隱蔽了樹立收集銜接和經由過程銜接發送數據的龐雜進程。上面所說的內容只實用於TCP協定。
1、銜接到辦事器
我們可使用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秒
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(); } } }
3、辦事器端法式
辦事器端運用法式應用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 Thread Thread 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 敕令來體驗一下這個法式的運轉成果
願望本文所述對年夜家的java法式設計有所贊助。