最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問候服務(wù)

 更新時(shí)間:2016年01月15日 16:11:10   作者:gloomyfish  
這篇文章主要為大家介紹了Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問候服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例講解了Java Socket編程實(shí)現(xiàn)簡(jiǎn)單的問候服務(wù)的詳細(xì)代碼,供大家參考,具體內(nèi)容如下

服務(wù)器端:

實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的Hello服務(wù),打印輸出客戶端IP地址到控制臺(tái),對(duì)任何連接的客戶端都會(huì)發(fā)送一串字符(Hello, Java Socket)然后關(guān)閉與客戶端連接。等待下一個(gè)客戶端的連接請(qǐng)求到來。

客戶端:

實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的Socket連接到Hello服務(wù)器端,接受服務(wù)器端發(fā)送過來的字節(jié)數(shù)據(jù)打印并輸出內(nèi)容到控制臺(tái)。

關(guān)鍵技巧:

由于JAVA中提供非常多的輸入與輸出流API,導(dǎo)致很多初學(xué)者接觸JAVA SOCKET編程時(shí),由于對(duì)網(wǎng)絡(luò)字節(jié)通信的本質(zhì)缺乏了解,直接一個(gè)readline()去接受Socket字節(jié)流。但是由于發(fā)送一方并沒有發(fā)送/r/n導(dǎo)致一直無法讀到數(shù)據(jù),這個(gè)是最常見的一個(gè)錯(cuò)誤。另外一些常見的錯(cuò)誤包括沒有初始化接受緩沖區(qū)導(dǎo)致字符亂碼,沒有按照讀入接受到字節(jié)數(shù)重新組裝,導(dǎo)致接受到的數(shù)據(jù)異常。所以代碼演示了什么叫按字節(jié)發(fā)送與按字節(jié)接受,這個(gè)是網(wǎng)絡(luò)編程中非常重要的概念與原則。讓那些輸入流println()方法與輸出流readline()方法見鬼去吧,不是不好用,而是我建議你不要用,因?yàn)槟切?huì)妨礙你的網(wǎng)絡(luò)編程本質(zhì)的認(rèn)識(shí)與理解。另外我要特別說明一下:有時(shí)候flush()真的不是必須的除非你使用了帶有緩沖的輸入與輸出流來讀寫字節(jié)。

服務(wù)器端代碼:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class HelloService extends Thread { 
  private ServerSocket serverSocket; 
  public HelloService(int port) throws IOException { 
    serverSocket = new ServerSocket(port); 
  } 
 
  public void run() 
  { 
    try { 
      while(true) 
      { 
        System.out.println("Waiting for client on port " + serverSocket.getLocalPort()); 
        Socket client = serverSocket.accept(); // blocked & waiting for income socket 
        System.out.println("Just connected to " + client.getRemoteSocketAddress()); 
        DataOutputStream dos = new DataOutputStream(client.getOutputStream()); 
        byte[] hello = "Hello, Java Socket".getBytes(); 
        dos.write(hello, 0, hello.length); 
        dos.close(); 
        client.close(); 
      } 
    } catch(Exception e) { 
      e.printStackTrace(); 
    } 
  } 
   
  public static void main(String[] args) { 
    try { 
      HelloService service = new HelloService(9999); 
      service.start(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

服務(wù)器在端口9999監(jiān)聽并等待連接,使用Java Thread來實(shí)現(xiàn)服務(wù)器端啟動(dòng)。
客戶端代碼如下:

package com.gloomyfish.socket.tutorial.two; 
 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
 
public class HelloClient { 
  private int clientNumber; 
  private SocketAddress address; 
  public HelloClient(int clientNum) { 
    clientNumber = clientNum; 
  } 
   
  public void setupClients(String serverHostName, int port) throws IOException { 
    address = new InetSocketAddress(serverHostName, port); 
    for(int i=0; i<clientNumber; i++) { 
      System.out.println(); 
      System.out.println("start client No. " + (i+1)); 
      Socket socket = new Socket(); 
      socket.connect(address); 
      DataInputStream bufferedReader = new DataInputStream(socket.getInputStream()); 
      byte[] cbuff = new byte[256]; 
      char[] charBuff = new char[256]; 
      int size = 0; 
      while( (size = bufferedReader.read(cbuff))> 0) { 
        convertByteToChar(cbuff, charBuff, size); 
        System.out.println(charBuff); 
      } 
      bufferedReader.close(); 
      socket.close(); 
    } 
  } 
   
  private void convertByteToChar(byte[] cbuff, char[] charBuff, int size) { 
    for(int i=0; i<charBuff.length; i++) { 
      if(i < size) { 
        charBuff[i] = (char)cbuff[i]; 
      } else { 
        charBuff[i] = ' '; 
      } 
    } 
     
  } 
 
  public static void main(String[] args) { 
    try { 
      HelloClient client = new HelloClient(10); 
      client.setupClients("localhost", 9999); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

啟動(dòng)10個(gè)客戶端去連接服務(wù)器端,接受到服務(wù)器端問候以后客戶端關(guān)閉連接。
特別提示:一定要初始化緩沖區(qū)charBuff
程序運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之生活旅行分享平臺(tái)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之生活旅行分享平臺(tái)的實(shí)現(xiàn)

    這是一個(gè)使用了java+Springboot+JPA+Jsp+Html+js+Ajax+maven+mysql開發(fā)的生活旅行分享平臺(tái),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有分享發(fā)布平臺(tái)該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • SpringBoot集成Hadoop實(shí)現(xiàn)文件的上傳和下載功能

    SpringBoot集成Hadoop實(shí)現(xiàn)文件的上傳和下載功能

    Spring?Hadoop簡(jiǎn)化了Apache?Hadoop,提供了一個(gè)統(tǒng)一的配置模型以及簡(jiǎn)單易用的API來使用HDFS、MapReduce、Pig以及Hive,這篇文章主要介紹了SpringBoot集成Hadoop實(shí)現(xiàn)文件的上傳和下載,需要的朋友可以參考下
    2024-07-07
  • SpringCloud Config配置中心原理以及環(huán)境切換方式

    SpringCloud Config配置中心原理以及環(huán)境切換方式

    這篇文章主要介紹了SpringCloud Config配置中心原理以及環(huán)境切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解java線程的開始、暫停、繼續(xù)

    詳解java線程的開始、暫停、繼續(xù)

    本文將介紹通過線程讀取文件內(nèi)容,并且可以控制線程的開始、暫停、繼續(xù),來控制讀文件。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • gradle安裝配置以及使用最新方法

    gradle安裝配置以及使用最新方法

    這篇文章主要給大家介紹了關(guān)于gradle安裝配置以及使用的相關(guān)資料,Gradle是一個(gè)基于ApacheAnt和ApacheMaven概念的項(xiàng)目自動(dòng)化構(gòu)建開源工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Maven項(xiàng)目部署到服務(wù)器設(shè)置訪問路徑以及配置虛擬目錄的方法

    Maven項(xiàng)目部署到服務(wù)器設(shè)置訪問路徑以及配置虛擬目錄的方法

    今天小編就為大家分享一篇關(guān)于Maven項(xiàng)目部署到服務(wù)器設(shè)置訪問路徑以及配置虛擬目錄的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • JDK源碼分析之String、StringBuilder和StringBuffer

    JDK源碼分析之String、StringBuilder和StringBuffer

    這篇文章主要給大家介紹了關(guān)于JDK源碼分析之String、StringBuilder和StringBuffer的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用jdk具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Mybatis-Plus主鍵生成策略的方法

    Mybatis-Plus主鍵生成策略的方法

    本文主要介紹了Mybatis-Plus主鍵生成策略的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java9中對(duì)集合類擴(kuò)展的of方法解析

    Java9中對(duì)集合類擴(kuò)展的of方法解析

    這篇文章主要介紹了Java9 中對(duì)集合類擴(kuò)展的of方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • idea企業(yè)開發(fā)之新建各類型項(xiàng)目的詳細(xì)教程

    idea企業(yè)開發(fā)之新建各類型項(xiàng)目的詳細(xì)教程

    這篇文章主要介紹了idea企業(yè)開發(fā)之新建各類型項(xiàng)目的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

清水县| 江油市| 新源县| 钦州市| 四平市| 都江堰市| 周宁县| 高邑县| 都昌县| 会泽县| 伊宁市| 扬中市| 信丰县| 永仁县| 图木舒克市| 定西市| 卢龙县| 山东| 姜堰市| 昆山市| 建湖县| 杨浦区| 铜山县| 太湖县| 娄底市| 红安县| 双城市| 武邑县| 南江县| 沂源县| 孝义市| 大竹县| 商丘市| 香港 | 图木舒克市| 潜江市| 桐柏县| 牙克石市| 江华| 鄂州市| 和静县|