欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶端應(yīng)用實(shí)例

 更新時(shí)間:2015年04月17日 09:04:38   作者:司青  
這篇文章主要介紹了Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶端應(yīng)用,以實(shí)例形式較為詳細(xì)的分析了java網(wǎng)絡(luò)編程的原理與服務(wù)器端客戶端的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Java網(wǎng)絡(luò)編程之簡(jiǎn)單的服務(wù)端客戶端應(yīng)用。分享給大家供大家參考。具體如下:

在Java中,我們使用java.net.Socket及其相關(guān)類來(lái)完成有關(guān)網(wǎng)絡(luò)的相關(guān)功能。Socket類非常簡(jiǎn)單易用,因?yàn)镴ava技術(shù)隱藏了建立網(wǎng)絡(luò)連接和通過(guò)連接發(fā)送數(shù)據(jù)的復(fù)雜過(guò)程。下面所說(shuō)的內(nèi)容只適用于TCP協(xié)議。

一、連接到服務(wù)器

我們可以使用Socket類的構(gòu)造函數(shù)來(lái)打開(kāi)一個(gè)套接字,如

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

其中,210.0.235.14是一個(gè)點(diǎn)分十進(jìn)制的String對(duì)象,表示目的主機(jī)的IP地址(或主機(jī)名), 13表示指定連接目標(biāo)主機(jī)的13端口。這里的210.0.235.14是位于香港的一個(gè)授時(shí)服務(wù)器,授時(shí)服務(wù)器默認(rèn)的端口一般都為13.
注意,在成功連接到服務(wù)器之前,程序會(huì)阻塞。
接下來(lái)可以使用Socket類的getInputStream()方法來(lái)得到一個(gè)InputStream對(duì)象,通過(guò)這個(gè)對(duì)象就可以獲取到目標(biāo)主機(jī)給我們發(fā)過(guò)來(lái)的信息:

InputStream inStream = sk.getInputStream();

同理,要向目標(biāo)主機(jī)發(fā)送數(shù)據(jù),則可以調(diào)用getOutputStream()方法來(lái)獲取一個(gè)輸出流對(duì)象。
下面的例子功能是連接授時(shí)服務(wù)器,并將返回的信息打印到標(biāo)準(zhǔn)輸出中:

try 
{ 
Socket sk = new Socket("210.0.235.14",13); 
sk.setSoTimeout(3000); 
  InputStream inStream = sk.getInputStream();
  //得到輸入流對(duì)象 
  Scanner sc = new Scanner(inStream); 
  //將數(shù)據(jù)打印到控制臺(tái) 
  while(sc.hasNextLine()) 
  { 
 String str = sc.nextLine(); 
 System.out.println("Output : " + str); 
  } 
  sk.close(); 
} 
catch(SocketTimeoutException e) //超時(shí)異常
{ 
  System.out.println("Time Out!"); 
} 
catch(Exception e) 
{ 
  e.printStackTrace(); 
}

代碼中setSoTimeout()方法可以設(shè)置超時(shí)時(shí)間,即如果超過(guò)了設(shè)定時(shí)間還沒(méi)有完成讀寫操作,則會(huì)拋出SocketTimeoutException,可以通過(guò)捕獲這個(gè)異常來(lái)關(guān)閉連接。
另外還有一個(gè)超時(shí)問(wèn)題是必須要解決的,就是這個(gè)Socket類的構(gòu)造函數(shù)

new Socket(host,port);

會(huì)一直無(wú)限地阻塞下去,直到成功建立了到目標(biāo)主機(jī)的連接為止。這當(dāng)然不是我們所希望的。我們可以通過(guò)如下調(diào)用方式解決此問(wèn)題:

Socket sk = new Socker();
sk.connect(new InetSocketAddress(host,port),2000);
//設(shè)置超時(shí)時(shí)間為2秒

二、獲取主機(jī)地址

InetAddress類的靜態(tài)方法getByName(hostname)可以返回代表了某個(gè)主機(jī)地址的InetAddress對(duì)象,這個(gè)對(duì)象封閉了一個(gè)4字節(jié)的序列,即主機(jī)的IP地址。然后再調(diào)用getHostAddress()方法返回一個(gè)表示IP地址的String對(duì)象.

一些訪問(wèn)量大的主機(jī)名通常會(huì)對(duì)應(yīng)著多個(gè)IP地址以實(shí)現(xiàn)負(fù)載均衡。我們可以調(diào)用getAllByName()方法來(lái)獲得所有主機(jī)地址,該方法返回一個(gè)InetAddress對(duì)象的數(shù)組。

下面是一個(gè)簡(jiǎn)單的小程序,實(shí)現(xiàn)的功能是,如果不在命令行中設(shè)置參數(shù),就打印出本地的IP地址,如果指定了主機(jī)名,則打印出該主機(jī)所有的IP地址:

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

三、服務(wù)器端程序

服務(wù)器端應(yīng)用程序使用ServerSocket類來(lái)創(chuàng)建套接字,并鈄其綁定至本地端口中,如

ServerSocket sock = new ServerSocker(8000);

sock.accept()方法讓程序不停地等待連接,該方法只有當(dāng)有客戶端連接時(shí)才會(huì)返回一個(gè)代表了新連接的Socket對(duì)象,即該方法會(huì)發(fā)生阻塞。
這里一般要為每個(gè)連接新開(kāi)啟一個(gè)線程為其服務(wù)。
下面是一個(gè)完整的例子,服務(wù)端在8400端口處等待連接,每當(dāng)連接到來(lái)時(shí),新開(kāi)一個(gè)線程為其服務(wù),并將連接信息寫入的日志文件中:

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 + "個(gè)用戶 " + client.getInetAddress().getHostAddress() + " 已連接\n"; 
        System.out.print(prompt); //在控制臺(tái)輸出信息 
        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(); 
    } 
  } 
} 
/* 
 * 服務(wù)線程類 
 */ 
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'關(guān)閉聯(lián)接]"); 
      while(recv.hasNextLine()) 
      { 
        String str = recv.nextLine(); 
        if(str.equals("bye")) 
        { 
          send.println("See you later ~ ^-^"); 
          break; 
        } 
        send.println("這是個(gè)測(cè)試程序,現(xiàn)在還沒(méi)有什么功能哦"); 
      } 
      Date time = new Date(); 
      String prompt = time.toString() + ": 第" + ix + "個(gè)用戶 " + client.getInetAddress().getHostAddress() + " 已斷開(kāi)連接\n"; 
      System.out.print(prompt); 
      ServerDemo.writeLog(prompt); //寫入到文件中 
      client.close(); 
    } 
    catch(Exception e) 
    { 
      e.printStackTrace(); 
    } 
  } 
}

這個(gè)程序已經(jīng)被放到了服務(wù)器上,大家可以使用telnet youthol.tk 8400 命令來(lái)體驗(yàn)一下這個(gè)程序的運(yùn)行結(jié)果

希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C++排序算法之桶排序原理及實(shí)現(xiàn)詳解

    C++排序算法之桶排序原理及實(shí)現(xiàn)詳解

    這篇文章主要介紹了C++排序算法之桶排序原理及實(shí)現(xiàn)詳解, C++ 桶排序是一種線性時(shí)間復(fù)雜度的排序算法,它通過(guò)將待排序元素分配到不同的桶中,然后對(duì)每個(gè)桶中的元素進(jìn)行排序,最后將所有桶中的元素按順序合并得到有序序列,需要的朋友可以參考下
    2023-10-10
  • 淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程

    淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程

    這篇文章主要介紹了淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程的相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10
  • 在Java中FreeMarker?模板來(lái)定義字符串模板

    在Java中FreeMarker?模板來(lái)定義字符串模板

    這篇文章主要介紹了在Java中FreeMarker?模板來(lái)定義字符串模板,文章基于Java的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • Java實(shí)現(xiàn)LeetCode(報(bào)數(shù))

    Java實(shí)現(xiàn)LeetCode(報(bào)數(shù))

    這篇文章主要介紹了Java實(shí)現(xiàn)LeetCode(報(bào)數(shù)),本文通過(guò)使用java實(shí)現(xiàn)leetcode的報(bào)數(shù)題目和實(shí)現(xiàn)思路分析,需要的朋友可以參考下
    2021-06-06
  • Java利用序列化實(shí)現(xiàn)對(duì)象深度clone的方法

    Java利用序列化實(shí)現(xiàn)對(duì)象深度clone的方法

    這篇文章主要介紹了Java利用序列化實(shí)現(xiàn)對(duì)象深度clone的方法,實(shí)例分析了java序列化及對(duì)象克隆的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • SpringBoot整合Swagger教程詳解

    SpringBoot整合Swagger教程詳解

    SpringBoot是一個(gè)基于Spring框架的輕量級(jí)開(kāi)源框架,它的出現(xiàn)極大地簡(jiǎn)化了Spring應(yīng)用的搭建和開(kāi)發(fā),本文將介紹如何在SpringBoot中使用Swagger來(lái)實(shí)現(xiàn)接口文檔的自動(dòng)生成,感興趣的同學(xué)可以參考一下
    2023-04-04
  • 詳解Android中的Toast源碼

    詳解Android中的Toast源碼

    這篇文章主要介紹了詳解Android中的Toast源碼,Toast使用Java語(yǔ)言實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07
  • Spring Boot集成Java DSL的實(shí)現(xiàn)代碼

    Spring Boot集成Java DSL的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Spring Boot集成Java DSL的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • springboot集成nacos讀取nacos配置數(shù)據(jù)的原理

    springboot集成nacos讀取nacos配置數(shù)據(jù)的原理

    這篇文章主要介紹了springboot集成nacos讀取nacos配置數(shù)據(jù)的原理,文中有詳細(xì)的代碼流程,對(duì)大家學(xué)習(xí)springboot集成nacos有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Java實(shí)現(xiàn)文件點(diǎn)擊沒(méi)反應(yīng)的方法

    Java實(shí)現(xiàn)文件點(diǎn)擊沒(méi)反應(yīng)的方法

    jsp頁(yè)面鏈接,點(diǎn)擊訪問(wèn)action用IO流去下載服務(wù)器上的文件,問(wèn)題是任憑怎么點(diǎn)擊都沒(méi)反應(yīng),日志也不報(bào)錯(cuò)。這篇文章給大家介紹Java實(shí)現(xiàn)文件點(diǎn)擊沒(méi)反應(yīng)的方法,需要的朋友參考下吧
    2018-07-07

最新評(píng)論