程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java收集編程之簡略的辦事端客戶端運用實例

Java收集編程之簡略的辦事端客戶端運用實例

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved