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

Java利用Socket類實現(xiàn)TCP通信程序

 更新時間:2024年02月29日 15:44:57   作者:VincentHu_  
TCP通信能實現(xiàn)兩臺計算機之間的數(shù)據(jù)交互,通信的兩端,要嚴格區(qū)分為客戶端與服務端,下面我們就來看看Java如何利用Socket類實現(xiàn)TCP通信程序吧

TCP通信能實現(xiàn)兩臺計算機之間的數(shù)據(jù)交互,通信的兩端,要嚴格區(qū)分為客戶端(Client)與服務端(Server)。

兩端通信時步驟:

  • 服務端程序需要先啟動,等待客戶端的連接。
  • 客戶端主動連接服務器端,連接成功才能通信。服務端不可以主動連接客戶端。

在Java中,提供了兩個類用于實現(xiàn)TCP通信程序:

客戶端:java.net.Socket類表示。創(chuàng)建Socket對象,向服務端發(fā)出連接請求,服務端響應請求,兩者建立連接開始通信。

服務端:java.net.ServerSocket類表示。創(chuàng)建ServerSocket對象,相當于開啟一個服務,并等待客戶端的連接。

InetAddress類

這個類代表一個互聯(lián)網(wǎng)協(xié)議(IP)地址。

常用方法

  • static InetAddress getLocalHost():返回本地主機的地址。
  • static InetAddress getByName(String host):根據(jù)主機名獲取主機信息。
  • String getHostAddress():根據(jù)InetAddress對象獲取ip地址。
  • String getHostName():根據(jù)InetAddress對象獲取主機名。
public static void main(String[] args) throws UnknownHostException {
    // 獲取本機的InetAddress對象
    InetAddress localHost = InetAddress.getLocalHost();
    System.out.println(localHost);
    // 根據(jù)本機的主機名獲取InetAddress對象
    InetAddress host = InetAddress.getByName("DESKTOP-3G22U7M");
    System.out.println(host);
    // 根據(jù)域名獲取InetAddress對象
    InetAddress host2 = InetAddress.getByName("www.baidu.com");
    System.out.println(host2);
    // 根據(jù)InetAddress對象獲取ip地址
    String hostAddress = host2.getHostAddress();
    System.out.println(hostAddress);
    // 根據(jù)InetAddress對象獲取主機名
    String hostName = host2.getHostName();
    System.out.println(hostName);
}

Socket類

java.net.Socket類實現(xiàn)客戶端套接字(也可以就叫“套接字”)。該類實現(xiàn)客戶端套接字,套接字指的是兩臺設備之間通訊的端點。

Socket允許程序把網(wǎng)絡連接當成一個流,數(shù)據(jù)在兩個Socket間通過IO傳輸。

構(gòu)造方法

public Socket(String host, int port):創(chuàng)建套接字對象并將其連接到指定主機上的指定端口號。如果指定的host是null ,則相當于指定地址為回送地址。

String host:服務器主機的名稱/服務器的IP地址。

int port:服務器的端口號。

Socket client = new Socket("127.0.0.1", 6666);

回送地址(127.x.x.x) 是本機回送地址(Loopback Address),主要用于網(wǎng)絡軟件測試以及本地機進程間通信,無論什么程序,一旦使用回送地址發(fā)送數(shù)據(jù),立即返回,不進行任何網(wǎng)絡傳輸。

常用方法

public InputStream getInputStream():返回此套接字的輸入流。

如果此Scoket具有相關(guān)聯(lián)的通道,則生成的InputStream 的所有操作也關(guān)聯(lián)該通道。

關(guān)閉生成的InputStream也將關(guān)閉相關(guān)的Socket。

public OutputStream getOutputStream(): 返回此套接字的輸出流。

如果此Scoket具有相關(guān)聯(lián)的通道,則生成的OutputStream 的所有操作也關(guān)聯(lián)該通道。

關(guān)閉生成的OutputStream也將關(guān)閉相關(guān)的Socket。

public void close():關(guān)閉此套接字。

一旦一個socket被關(guān)閉,它不可再使用。

關(guān)閉此socket也將關(guān)閉相關(guān)的InputStream和OutputStream 。

public void shutdownOutput(): 禁用此套接字的輸出流。

任何先前寫出的數(shù)據(jù)將被發(fā)送,隨后終止輸出流。

ServerSocket類

java.net.ServerSocket類:這個類實現(xiàn)了服務器套接字,該對象等待通過網(wǎng)絡的請求。

構(gòu)造方法

public ServerSocket(int port):使用該構(gòu)造方法在創(chuàng)建ServerSocket對象時,就可以將其綁定到一個指定的端口號上,參數(shù)port就是端口號。

ServerSocket server = new ServerSocket(6666);

常用方法

public Socket accept():偵聽并接受連接,返回一個新的Socket對象,用于和客戶端實現(xiàn)通信。該方法會一直阻塞直到建立連接。

TCP網(wǎng)絡程序

TCP通信分析

【服務端】啟動,創(chuàng)建ServerSocket對象,等待連接。

【客戶端】啟動,創(chuàng)建Socket對象,請求連接。

【服務端】接收連接,調(diào)用accept方法,并返回一個Socket對象。

【客戶端】Socket對象,獲取OutputStream,向服務端寫出數(shù)據(jù)。

【服務端】Scoket對象,獲取InputStream,讀取客戶端發(fā)送的數(shù)據(jù)。

到此,客戶端向服務端發(fā)送數(shù)據(jù)成功。

【服務端】Socket對象,獲取OutputStream,向客戶端回寫數(shù)據(jù)。

【客戶端】Scoket對象,獲取InputStream,解析回寫數(shù)據(jù)。

【客戶端】釋放資源,斷開連接。

自此,服務端向客戶端回寫數(shù)據(jù)。

服務端實現(xiàn)

public class ServerTCP {
    public static void main(String[] args) throws IOException {
    System.out.println("服務端啟動 , 等待連接 .... ");
        // 1.創(chuàng)建 ServerSocket對象,綁定端口,開始等待連接
        ServerSocket ss = new ServerSocket(6666);
        // 2.接收連接 accept 方法, 返回 socket 對象.
        Socket server = ss.accept();
        // 3.通過socket 獲取輸入流
        InputStream is = server.getInputStream();
        // 4.一次性讀取數(shù)據(jù)
        // 4.1 創(chuàng)建字節(jié)數(shù)組
        byte[] b = new byte[1024];
        // 4.2 據(jù)讀取到字節(jié)數(shù)組中.
        int len = is.read(b);
        // 4.3 解析數(shù)組,打印字符串信息
        String msg = new String(b, 0, len);
        System.out.println(msg);
        // =================回寫數(shù)據(jù)=======================
        // 5. 通過 socket 獲取輸出流
        OutputStream out = server.getOutputStream();
        // 6. 回寫數(shù)據(jù)
        out.write("我很好,謝謝你".getBytes());
        // 7.關(guān)閉資源.
        out.close();
        is.close();
        server.close();
    }
}

客戶端實現(xiàn)

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("客戶端 發(fā)送數(shù)據(jù)");
        // 1.創(chuàng)建 Socket ( ip , port ) , 確定連接到哪里.
        Socket client = new Socket("localhost", 6666);
        // 2.通過Scoket,獲取輸出流對象 
        OutputStream os = client.getOutputStream();
        // 3.寫出數(shù)據(jù).
        os.write("你好么? tcp ,我來了".getBytes());
        // ==============解析回寫=========================
        // 4. 通過Scoket,獲取 輸入流對象
        InputStream in = client.getInputStream();
        // 5. 讀取數(shù)據(jù)數(shù)據(jù)
        byte[] b = new byte[100];
        int len = in.read(b);
        System.out.println(new String(b, 0, len));
    // 6. 關(guān)閉資源 .
       in.close();
        os.close();
        client.close();
    }
}

到此這篇關(guān)于Java利用Socket類實現(xiàn)TCP通信程序的文章就介紹到這了,更多相關(guān)Java TCP通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java枚舉類使用Lombok方式

    Java枚舉類使用Lombok方式

    這篇文章主要介紹了Java枚舉類使用Lombok方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Java內(nèi)存泄露的示例代碼

    詳解Java內(nèi)存泄露的示例代碼

    這篇文章通過一個Demo來簡要介紹下ThreadLocal和ClassLoader導致內(nèi)存泄露最終OutOfMemory的場景。下面通過示例代碼給大家分享Java內(nèi)存泄露的相關(guān)知識,感興趣的朋友一起看看吧
    2017-12-12
  • SpringBoot應用啟動過程分析

    SpringBoot應用啟動過程分析

    這篇文章主要介紹了SpringBoot應用啟動過程分析,需要的朋友可以參考下
    2017-08-08
  • Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式

    Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式

    這篇文章主要介紹了Java查詢時間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 基于MapReduce實現(xiàn)決策樹算法

    基于MapReduce實現(xiàn)決策樹算法

    這篇文章主要為大家詳細介紹了基于MapReduce實現(xiàn)決策樹算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解如何解決SSM框架前臺傳參數(shù)到后臺亂碼的問題

    詳解如何解決SSM框架前臺傳參數(shù)到后臺亂碼的問題

    這篇文章主要介紹了詳解如何解決SSM框架前臺傳參數(shù)到后臺亂碼的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • java獲得mysql和oracle鏈接的類

    java獲得mysql和oracle鏈接的類

    這篇文章主要介紹了java獲得mysql和oracle鏈接的類,可實現(xiàn)基于jdbc的mysql與oracle數(shù)據(jù)庫連接,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • IDEA使用Maven創(chuàng)建父與子多模塊項目的圖文教程

    IDEA使用Maven創(chuàng)建父與子多模塊項目的圖文教程

    在?IntelliJ?IDEA?中使用?Maven?創(chuàng)建父與子多模塊項目是一個常見的開發(fā)實踐,有助于更好地組織和管理代碼,所以本文小編給大家介紹了IDEA使用Maven創(chuàng)建父與子多模塊項目的圖文教程,需要的小伙伴跟著小編一起來看看吧
    2025-03-03
  • Quarkus云原生開篇java框架簡介

    Quarkus云原生開篇java框架簡介

    Quarkus?是小紅帽開源的專門針對云容器環(huán)境優(yōu)化的云原生java框架,博主接下來的項目估計都會使用這個框架來開發(fā),相關(guān)的問題都會記錄在這個系列,本文是個開篇
    2022-02-02
  • 淺談DetachedCriteria和Criteria的使用方法(必看)

    淺談DetachedCriteria和Criteria的使用方法(必看)

    下面小編就為大家?guī)硪黄獪\談DetachedCriteria和Criteria的使用方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論