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

java實現(xiàn)Socket通信之單線程服務(wù)

 更新時間:2018年07月22日 11:39:43   作者:OneDay-X  
這篇文章主要為大家詳細介紹了java實現(xiàn)Socket通信的單線程服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

使用基于TCP 協(xié)議的雙向通信時,網(wǎng)絡(luò)中的兩個應(yīng)用程序之間必須首先建立一個連接,這兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。

建立網(wǎng)絡(luò)通信連接至少要一對端口號(socket)。socket本質(zhì)是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機,提供了網(wǎng)絡(luò)通信的能力。

Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現(xiàn)不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務(wù)軟件,同時提供幾種服務(wù)。每種服務(wù)都打開一個Socket,并綁定到一個端口上,不同的端口對應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務(wù)。

使用 socket 的通信模式

java.net 程序包將基于TCP 通信的socket 封裝為兩個類:類Socket 表達了一個用于建立TCP 連接的socket,該socket 既可由客戶程序使用,也可由服務(wù)程序

使用;類ServerSocket 則是一個服務(wù)端專門監(jiān)聽客戶程序連接請求的socket 的抽象,僅在服務(wù)程序中使用。

Socket通信過程

服務(wù)器端:

                 ① 創(chuàng)建ServerSocket對象,綁定監(jiān)聽端口

                 ② 通過accept()方法監(jiān)聽客戶端請求

                 ③ 連接建立后,通過輸入流讀取客戶端發(fā)送的請求信息

                 ④ 通過輸出流向客戶端發(fā)送響應(yīng)信息

                 ⑤ 關(guān)閉連接

客戶端:
                 ① 創(chuàng)建Socket對象,指明需要連接的服務(wù)器的地址和端口號

                 ② 連接建立后,通過輸出流想服務(wù)器端發(fā)送請求信息

                 ③ 通過輸入流獲取服務(wù)器響應(yīng)的信息

                 ④ 關(guān)閉連接

單線程服務(wù)程序代碼

服務(wù)端:

import java.net.*;
import java.io.*;
 
public class EchoServer {
  public static void main(String[] args)throws IOException {
    if (args.length != 1) {
      System.out.println("用法:EchoServer <端口號>");
      return ;
    }
 
    // 監(jiān)聽客戶程序的連接請求
    ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0]));
    System.out.println("服務(wù)程序正在監(jiān)聽端口" + args[0]);
    Socket socket = listenSocket.accept();
    // 從與客戶程序的新建連接獲取輸入流和輸出流
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));
    // 從客戶端讀取數(shù)據(jù),并寫回數(shù)據(jù)的加工結(jié)果
    String message;
    while ((message = in.readLine()) != null) {
      System.out.println("收到請求:" + message);
      out.println(message.toUpperCase());
    }
 
    // 關(guān)閉連接
    out.close();
    in.close();
    socket.close();
    listenSocket.close();
  }
}

客戶端:

import java.net.*;
import java.io.*;
 
public class EchoClient {
  public static void main(String[] args)throws Exception {
    if (args.length != 2) {
      System.out.println("用法:EchoClient <主機名> <端口號>");
      return ;
    }
 
    // 建立連接并打開相關(guān)聯(lián)的輸入流和輸出流
    Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
    System.out.println("當前socket信息:" + socket);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));
 
    // 將控制臺輸入的字符串發(fā)送給服務(wù)端,并顯示從服務(wù)端獲取的處理結(jié)果
    BufferedReader stdIn = new BufferedReader(new InputStreamReader
      (System.in));
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
      out.println(userInput);
      System.out.println("返回:" + in.readLine());
    }
    stdIn.close();
    // 關(guān)閉連接
    out.close();
    in.close();
    socket.close();
  }
}

運行結(jié)果示例(基于windows)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java如何自定義List中的sort()排序,用于日期排序

    java如何自定義List中的sort()排序,用于日期排序

    這篇文章主要介紹了java如何自定義List中的sort()排序,用于日期排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java面試必考之如何在項目中優(yōu)雅的拋出異常

    Java面試必考之如何在項目中優(yōu)雅的拋出異常

    這篇文章主要為大家詳細介紹了Java中的幾種異常關(guān)鍵字和異常類相關(guān)知識,本文比較適合剛?cè)肟覬ava的小白以及準備秋招的大佬閱讀,需要的可以收藏一下
    2023-06-06
  • Spring Boot整合MyBatis-Flex全過程

    Spring Boot整合MyBatis-Flex全過程

    這篇文章主要介紹了Spring Boot整合MyBatis-Flex全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java導(dǎo)出dbf文件生僻漢字處理方式

    java導(dǎo)出dbf文件生僻漢字處理方式

    這篇文章主要介紹了java導(dǎo)出dbf文件生僻漢字處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 基于Luhn算法的銀行卡校驗規(guī)則

    基于Luhn算法的銀行卡校驗規(guī)則

    這篇文章主要為大家介紹了基于Luhn算法的銀行卡校驗規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • JDK14的新特性NullPointerExceptions的使用

    JDK14的新特性NullPointerExceptions的使用

    這篇文章主要介紹了JDK14的新特性NullPointerExceptions的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Spring Boot Log4j2的配置使用詳解

    Spring Boot Log4j2的配置使用詳解

    本篇文章主要介紹了Spring Boot Log4j2的配置使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java實現(xiàn)簡單掃雷程序

    Java實現(xiàn)簡單掃雷程序

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單掃雷程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java Hutool工具實現(xiàn)驗證碼生成及Excel文件的導(dǎo)入和導(dǎo)出

    Java Hutool工具實現(xiàn)驗證碼生成及Excel文件的導(dǎo)入和導(dǎo)出

    Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,本文主要介紹了使用Hutool工具實現(xiàn)驗證碼生成和excel文件的導(dǎo)入、導(dǎo)出,需要的朋友可參考一下
    2021-11-11
  • windows 32位eclipse遠程hadoop開發(fā)環(huán)境搭建

    windows 32位eclipse遠程hadoop開發(fā)環(huán)境搭建

    這篇文章主要介紹了windows 32位eclipse遠程hadoop開發(fā)環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下
    2016-07-07

最新評論

祥云县| 陆河县| 孟村| 邓州市| 德保县| 夹江县| 甘谷县| 安徽省| 富锦市| 孙吴县| 桐庐县| 星子县| 高唐县| 蒙城县| 山阴县| 青海省| 洪湖市| 青田县| 卢龙县| 改则县| 榕江县| 巴中市| 建湖县| 巴彦淖尔市| 林口县| 镇沅| 龙陵县| 樟树市| 左云县| 得荣县| 邻水| 齐河县| 根河市| 修文县| 乌兰察布市| 曲松县| 新乡县| 五家渠市| 宜良县| 普兰店市| 错那县|