国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java網(wǎng)絡(luò)編程 - TCP通信

這篇具有很好參考價(jià)值的文章主要介紹了Java網(wǎng)絡(luò)編程 - TCP通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

TCP通信

快速入門(mén)(一發(fā)一收)

TCP協(xié)議回顧:

TCP是一種面向連接,安全、可靠的傳輸數(shù)據(jù)的協(xié)議

傳輸前,采用“三次握手”方式,點(diǎn)對(duì)點(diǎn)通信,是可靠的

在連接中可進(jìn)行大數(shù)據(jù)量的傳輸

TCP通信模式:

java tcp通信,JavaSE,網(wǎng)絡(luò),tcp/ip,java

在java中只要是使用java.net.Socket類(lèi)實(shí)現(xiàn)通信,底層即是使用了TCP協(xié)議

編寫(xiě)客戶(hù)端代碼

Socket(客戶(hù)端):

構(gòu)造器 說(shuō)明
Socket(String host , int port) 創(chuàng)建發(fā)送端的Socket對(duì)象與服務(wù)端連接,參數(shù)為服務(wù)端程序的ip和端口。

Socket類(lèi)成員方法:

方法 說(shuō)明
OutputStream getOutputStream() 獲得字節(jié)輸出流對(duì)象
InputStream getInputStream() 獲得字節(jié)輸入流對(duì)象

客戶(hù)端實(shí)現(xiàn)步驟:

  • 創(chuàng)建客戶(hù)端的Socket對(duì)象,請(qǐng)求與服務(wù)端的連接。
  • 使用socket對(duì)象調(diào)用getOutputStream()方法得到字節(jié)輸出流。
  • 使用字節(jié)輸出流完成數(shù)據(jù)的發(fā)送。
  • 不建議直接關(guān)閉socket管道釋放資源, 一般用戶(hù)退出時(shí)才會(huì)關(guān)閉。
/**
    客戶(hù)端
 */
public class ClientDemo {
    public static void main(String[] args) {
        try {
            // 1. 創(chuàng)建socket通信管道請(qǐng)求與服務(wù)端進(jìn)行連接
            /**
                參數(shù)一: 服務(wù)器IP地址
                參數(shù)二: 服務(wù)器端口號(hào)
             */
            Socket socket = new Socket("127.0.0.1", 7777);

            // 2. 從socket通信管道中獲取到字節(jié)輸出流
            OutputStream os = socket.getOutputStream();
            // 包裹低級(jí)字節(jié)輸出流為字節(jié)打印流
            PrintStream ps = new PrintStream(os);

            // 3. 打印流發(fā)送消息
            ps.println("我是TCP的客戶(hù)端");
            ps.flush(); // 刷新
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
編寫(xiě)服務(wù)器代碼

ServerSocket(服務(wù)端):

構(gòu)造器 說(shuō)明
ServerSocket(int port) 注冊(cè)服務(wù)端端口

ServerSocket類(lèi)成員方法:

方法 說(shuō)明
Socket accept() 等待接收客戶(hù)端的Socket通信連接
連接成功返回Socket對(duì)象與客戶(hù)端建立端到端通信

服務(wù)端實(shí)現(xiàn)步驟:

  • 創(chuàng)建ServerSocket對(duì)象,注冊(cè)服務(wù)端端口。
  • 調(diào)用ServerSocket對(duì)象的accept()方法,等待客戶(hù)端的連接,并得到Socket管道對(duì)象。
  • 通過(guò)Socket對(duì)象調(diào)用getInputStream()方法得到字節(jié)輸入流、完成數(shù)據(jù)的接收。
  • 不建議直接關(guān)閉socket管道釋放資源, 一般用戶(hù)退出時(shí)才會(huì)關(guān)閉。
/**
    服務(wù)器
 */
public class ServerDemo {
    public static void main(String[] args) {
        try {
            // 1. 創(chuàng)建ServerSocket對(duì)象注冊(cè)服務(wù)器端口
            ServerSocket serverSocket = new ServerSocket(7777);

            // 2. 調(diào)用accept方法, 等待客戶(hù)端連接, 連接成功返回socket管道對(duì)象
            Socket socket = serverSocket.accept();

            // 3. 從socket管道中獲取字節(jié)輸入流, 完成數(shù)據(jù)接受
            InputStream is = socket.getInputStream();
            // 把字節(jié)輸入流包裝為緩沖字符輸入流進(jìn)行消息接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 按照行讀取
            String message;
            if ((message = br.readLine()) != null) {
                System.out.println(message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

多發(fā)多收

需求

  • 使用TCP通信方式實(shí)現(xiàn):多發(fā)多收消息。

具體要求

  • 可以使用死循環(huán)控制服務(wù)端收完消息繼續(xù)等待接收下一個(gè)消息。
  • 客戶(hù)端也可以使用死循環(huán)等待用戶(hù)不斷輸入消息。
  • 客戶(hù)端一旦輸入了exit,則關(guān)閉客戶(hù)端程序,并釋放資源。

客戶(hù)端

/**
    客戶(hù)端
 */
public class ClientDemo {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 7777);

            OutputStream os = socket.getOutputStream();
            PrintStream ps = new PrintStream(os);

            // 客戶(hù)端使用死循環(huán)等待用戶(hù)不斷地輸入消息
            Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.println("發(fā)送消息: ");
                String inp = scanner.nextLine();
                // 一旦輸入了exit,則關(guān)閉客戶(hù)端程序,并釋放資源
                if (inp.equals("exit")) {
                    System.out.println("下線成功");
                    ps.close();
                    break;
                }
                ps.println(inp);
                ps.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

服務(wù)端

/**
    服務(wù)器
 */
public class ServerDemo {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(7777);

            Socket socket = serverSocket.accept();

            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            String message;
            // 死循環(huán)控制服務(wù)端收完消息繼續(xù)等待接收下一個(gè)消息
            while ((message = br.readLine()) != null) {
                System.out.println("收到消息: " + message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

多發(fā)多收(同時(shí)接受多個(gè)客戶(hù)端)

思考: 案例實(shí)現(xiàn)了多發(fā)多收,那么是否可以同時(shí)接收多個(gè)客戶(hù)端的消息?

不可以的。

因?yàn)榉?wù)端現(xiàn)在只有一個(gè)線程,只能與一個(gè)客戶(hù)端進(jìn)行通信; 并且上面代碼中, 我們只連接了一個(gè)客戶(hù)端然后就在死循環(huán)接受消息。

那么如何才可以讓服務(wù)端可以處理多個(gè)客戶(hù)端的通信需求?

引入多線程。

同時(shí)處理多個(gè)客戶(hù)端消息實(shí)現(xiàn)架構(gòu)如下:

主線程死循環(huán)不斷地接收socket鏈接, 每成功鏈接一個(gè)socket, 就交給子線程處理

java tcp通信,JavaSE,網(wǎng)絡(luò),tcp/ip,java

實(shí)現(xiàn)步驟如下:

優(yōu)化服務(wù)器代碼即可

創(chuàng)建一個(gè)線程類(lèi), 用來(lái)處理接收消息

public class ServerReaderThread extends Thread {
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            String message;
            // 死循環(huán)控制服務(wù)端收完消息繼續(xù)等待接收下一個(gè)消息
            while ((message = br.readLine()) != null) {
                System.out.println("收到消息: " + message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在服務(wù)器主線程中, 每鏈接到一個(gè)socket都要?jiǎng)?chuàng)建一個(gè)線程類(lèi)交給子線程處理

/**
    服務(wù)器
 */
public class ServerDemo {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            // 1. 主線程中定義一個(gè)死循環(huán)由主線程不斷地接收客戶(hù)端socket管道連接
            while (true) {
                // 2. 每接收到一個(gè)socket管道, 都交給一個(gè)獨(dú)立的子線程負(fù)責(zé)讀取消息
                Socket socket = serverSocket.accept();
                // 交給子線程處理, 并啟動(dòng)子線程
                new ServerReaderThread(socket).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

線程池優(yōu)化

目前的通信架構(gòu)存在什么問(wèn)題?

客戶(hù)端與服務(wù)端的線程模型是: 1-1的關(guān)系, 有多少客戶(hù)端就會(huì)創(chuàng)建多少線程。

客戶(hù)端并發(fā)越多,系統(tǒng)癱瘓的越快。

引入線程池處理多個(gè)客戶(hù)端消息的架構(gòu)如下:

java tcp通信,JavaSE,網(wǎng)絡(luò),tcp/ip,java

線程池優(yōu)化多發(fā)多收, 我們只需要優(yōu)化服務(wù)器的代碼即可:

創(chuàng)建一個(gè)Runnable任務(wù)類(lèi)

public class ServerReaderRunnable implements Runnable {
    private Socket socket;
    public ServerReaderRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            String message;
            // 死循環(huán)控制服務(wù)端收完消息繼續(xù)等待接收下一個(gè)消息
            while ((message = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + "收到消息: " + message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

優(yōu)化服務(wù)器端代碼

/**
    服務(wù)器
 */
public class ServerDemo {
    // 使用靜態(tài)變量記錄一個(gè)線程池對(duì)象
    private static ExecutorService pool = new ThreadPoolExecutor(3, 5, 6,
            TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "上線了");
                // 創(chuàng)建Runnable任務(wù)交給線程池處理
                pool.execute(new ServerReaderRunnable(socket));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

線程池優(yōu)勢(shì)是什么?

服務(wù)端可以復(fù)用線程處理多個(gè)客戶(hù)端,可以避免系統(tǒng)癱瘓。

適合客戶(hù)端通信時(shí)長(zhǎng)較短的場(chǎng)景。
計(jì)思想, 客戶(hù)端將消息發(fā)送給服務(wù)器, 再由服務(wù)器進(jìn)行轉(zhuǎn)發(fā)給其他客戶(hù)端。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-804939.html

到了這里,關(guān)于Java網(wǎng)絡(luò)編程 - TCP通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶(hù)端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶(hù)端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    ??各位讀者好, 我是小陳, 這是我的個(gè)人主頁(yè) ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過(guò)博客輸出所學(xué)知識(shí) ??如果本篇對(duì)你有幫助, 煩請(qǐng)點(diǎn)贊關(guān)注支持一波, 感激不盡 ?? 希望我的專(zhuān)欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語(yǔ)法, 類(lèi)和對(duì)象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書(shū)管理系統(tǒng)

    2024年02月05日
    瀏覽(32)
  • Java網(wǎng)絡(luò)編程(UDP、TCP)

    在網(wǎng)絡(luò)通信協(xié)議下,不同計(jì)算機(jī)上運(yùn)行的程序,進(jìn)行的數(shù)據(jù)傳輸。 應(yīng)用場(chǎng)景:即時(shí)通信、網(wǎng)游對(duì)戰(zhàn)、金融證券、國(guó)際貿(mào)易、郵件、等等。 不管是什么場(chǎng)景,都是計(jì)算機(jī)跟計(jì)算機(jī)之間通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸。 Java中可以使用java.net包下的技術(shù)輕松開(kāi)發(fā)出常見(jiàn)的網(wǎng)絡(luò)應(yīng)用程序。

    2024年02月05日
    瀏覽(39)
  • 【Java學(xué)習(xí)筆記】 68 - 網(wǎng)絡(luò)——TCP編程、UDP編程

    【Java學(xué)習(xí)筆記】 68 - 網(wǎng)絡(luò)——TCP編程、UDP編程

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 目錄 項(xiàng)目代碼 網(wǎng)絡(luò) 一、網(wǎng)絡(luò)相關(guān)概念 1.網(wǎng)絡(luò)通訊 2.網(wǎng)絡(luò) 3.IP地址 4.域名 5.端口號(hào) 6.網(wǎng)絡(luò)通訊協(xié)議 TCP協(xié)議:傳輸控制協(xié)議 UDP協(xié)議: 二、InetAddress類(lèi) 1.相關(guān)方法 三、Socket 1.基本介紹 2.TCP網(wǎng)絡(luò)通信編程 基本介紹 應(yīng)用案例

    2024年02月04日
    瀏覽(26)
  • Java網(wǎng)絡(luò)編程 *TCP與UDP協(xié)議*

    Java網(wǎng)絡(luò)編程 *TCP與UDP協(xié)議*

    把分布在 不同地理區(qū)域 的具有獨(dú)立功能的計(jì)算機(jī), 通過(guò)通信設(shè)備與線路 連接起來(lái),由功能完善的軟件實(shí)現(xiàn)資源共享和信息傳遞的 系統(tǒng) 簡(jiǎn)單來(lái)說(shuō)就是把不同地區(qū)的計(jì)算機(jī)通過(guò)設(shè)備連接起來(lái),實(shí)現(xiàn)不同地區(qū)之前的數(shù)據(jù)傳輸 網(wǎng)絡(luò)編程 是借助計(jì)算機(jī)網(wǎng)絡(luò),實(shí)現(xiàn)我們所寫(xiě)的程序,在不同

    2024年01月16日
    瀏覽(30)
  • Java-Java基礎(chǔ)學(xué)習(xí)(2)-網(wǎng)絡(luò)編程-TCP-UDP

    2.1. 通信協(xié)議 TCP、UDP對(duì)比 TCP 打電話 連接,穩(wěn)定 三次握手,四次揮手 客戶(hù)端、服務(wù)端 傳輸完成,釋放連接,效率低 UDP 發(fā)短信 不連接,不穩(wěn)定 客戶(hù)端,服務(wù)端,沒(méi)有明確的界限 不管有沒(méi)有準(zhǔn)備好,都可以發(fā)給你 導(dǎo)彈 DDOS:洪水供給?。柡凸簦?2.2. Tcp上傳測(cè)試 總結(jié):

    2024年04月09日
    瀏覽(32)
  • Java網(wǎng)絡(luò)編程(二)Socket 套接字(TCP和UDP),以及TCP的回顯

    Java網(wǎng)絡(luò)編程(二)Socket 套接字(TCP和UDP),以及TCP的回顯

    我們軟件工作者,著重編寫(xiě)的是應(yīng)用層的代碼,但是發(fā)送這個(gè)數(shù)據(jù),我們就需要將應(yīng)用層傳輸?shù)絺鬏攲?,也就意味著我們需要調(diào)用應(yīng)用層的API,統(tǒng)稱(chēng)為 Socket API。 套接字的分類(lèi): 流套接字:使用傳輸層TCP協(xié)議 特點(diǎn): 有連接:使用 TCP 通信的雙方,需要時(shí)刻保存對(duì)方的相關(guān)消

    2024年02月09日
    瀏覽(20)
  • 【Java網(wǎng)絡(luò)編程】OSI七層網(wǎng)絡(luò)模型與TCP/IP協(xié)議簇

    【Java網(wǎng)絡(luò)編程】OSI七層網(wǎng)絡(luò)模型與TCP/IP協(xié)議簇

    1.1、OSI七層網(wǎng)絡(luò)模型 OSI七層網(wǎng)絡(luò)模型中,每層的功能如下: 應(yīng)用層:人與計(jì)算機(jī)網(wǎng)絡(luò)交互的窗口。 表示層:負(fù)責(zé)數(shù)據(jù)格式的封裝,如加密、壓縮、編解碼等。 會(huì)話層:建立、終止、管理不同端間的會(huì)話連接。 傳輸層:提供端到端(兩臺(tái)機(jī)器)之間的傳輸機(jī)制,以及提供流

    2024年04月11日
    瀏覽(29)
  • .NET網(wǎng)絡(luò)編程——TCP通信

    .NET網(wǎng)絡(luò)編程——TCP通信

    ? ? ? ? 就是將不同區(qū)域的電腦連接到一起,組成局域網(wǎng)、城域網(wǎng)或廣域網(wǎng)。把分部在不同地理區(qū)域的計(jì)算機(jī)于專(zhuān)門(mén)的外部設(shè)備用通信線路 互聯(lián)成一個(gè)規(guī)模大、功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計(jì)算機(jī)可以方便地互相傳遞信息,共享硬件、軟件、數(shù)據(jù)信息等資源。 ??????

    2024年02月16日
    瀏覽(28)
  • Java網(wǎng)絡(luò)編程基礎(chǔ):TCP Socket套接字編程 IntAddress UDP等...

    Java網(wǎng)絡(luò)編程基礎(chǔ):TCP Socket套接字編程 IntAddress UDP等...

    目錄 一,網(wǎng)絡(luò)基礎(chǔ) 1.IP地址 2.端口 3.TCP/UDP協(xié)議 4.網(wǎng)絡(luò)編程開(kāi)發(fā)模式 ?二,基于套接字的Java網(wǎng)絡(luò)編程 1.Socket ?2.InetAddress 三.基于TCP的Socket網(wǎng)絡(luò)編程 1.單服務(wù)器端與單Socket客戶(hù)端一次通訊 2.單服務(wù)器端接收多次通訊 ?3.TCP網(wǎng)絡(luò)通訊補(bǔ)充 四,基于UDP的網(wǎng)絡(luò)編程 1. DatagramSocket:收發(fā)

    2024年04月29日
    瀏覽(28)
  • Java中的網(wǎng)絡(luò)編程------基于Socket的TCP編程和基于UDP的網(wǎng)絡(luò)編程,netstat指令

    Java中的網(wǎng)絡(luò)編程------基于Socket的TCP編程和基于UDP的網(wǎng)絡(luò)編程,netstat指令

    Socket 在Java中,Socket是一種用于網(wǎng)絡(luò)通信的編程接口, 它允許不同計(jì)算機(jī)之間的程序進(jìn)行數(shù)據(jù)交換和通信 。Socket使得網(wǎng)絡(luò)應(yīng)用程序能夠通過(guò)TCP或UDP協(xié)議在不同主機(jī)之間建立連接、發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。以下是Socket的基本介紹: Socket類(lèi)型 :在Java中,有兩種主要類(lèi)型的Socket,分

    2024年02月10日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包