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

Java使用線程池實現(xiàn)socket編程的方法詳解

 更新時間:2022年03月30日 14:28:07   作者:宋振嘉  
這篇文章主要為大家詳細(xì)介紹了Java使用線程池實現(xiàn)socket編程的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

前言

以多個客戶端和一個服務(wù)端的socket通信為例,服務(wù)端啟動時創(chuàng)建一個固定大小的線程池。服務(wù)端每接收到一個連接請求后(通信任務(wù)),交給線程池執(zhí)行,任務(wù)類實現(xiàn)了Runnable接口,用于跟客戶端進(jìn)行讀寫操作,該類的對象作為任務(wù)通過execute(Runnable task)提交給線程池。

一、一個簡單的C/S模型實現(xiàn)

1.服務(wù)器:

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("server start");
        ServerSocket server = new ServerSocket(1003);
        while (true) {
            Socket client = server.accept();
            InputStream input = client.getInputStream();
            byte[] b = new byte[8196];
            int len = input.read(b);
            System.out.println(new String(b, 0, len));
            if(new String(b).equals("close"))
                break;
            client.close();
        }
        server.close();
    }
}

2.客戶端:

import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
    public static void main(String[] args) throws Exception {
        System.out.println("client start");
        Scanner scanner =new Scanner(System.in);
        Socket client =new Socket("localhost",1003);
        OutputStream out = client.getOutputStream();
        while (true) {
            String str = scanner.nextLine();
            out.write(str.getBytes());
        }
    }
}

此處只能服務(wù)器接收客戶端信息。

二、線程池使用方法

1.新建一個線程池

ExecutorService pool = Executors.newFixedThreadPool(3);

創(chuàng)建一個線程池,該線程池重用在共享無界隊列上運(yùn)行的固定數(shù)量的線程。 在任何時候,最多3個線程將是活動的處理任務(wù)。如果在所有線程都處于活動狀態(tài)時提交了其他任務(wù),它們將在隊列中等待,直到有線程可用。 如果任何線程在關(guān)閉之前的執(zhí)行過程中由于失敗而終止,如果需要執(zhí)行后續(xù)任務(wù),新的線程將取代它。 池中的線程將一直存在,直到顯式關(guān)閉。

2.用Runnable接口實現(xiàn)線程

private static class InnerThread implements Runnable{
public void run();
}

3.創(chuàng)建線程對象并提交至線程池執(zhí)行

InnerThread innerThread = new InnerThread();
pool.execute(innerThread);

三、結(jié)合起來

當(dāng)新的連接建立時創(chuàng)建一個新線程并提交到線程池

while(true){
                Socket clientSocket = server.accept();
                InnerThread innerThread = new InnerThread(clientSocket);
                pool.execute(innerThread);
            }

run方法為如何處理新連接,以及客戶端和服務(wù)端的信息交流。

四、使用新的輸入輸出流

由于OutputStream和InputStream類有方法沒有實現(xiàn)或是實現(xiàn)的不是很好,所以我們選擇使用
BufferedReader,PrintWriter類來實現(xiàn)通信。

服務(wù)器:

BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
while(true){
                    String buf = br.readLine();
                    System.out.println(Thread.currentThread().getName()+" client: " + buf);
                    if(buf.equals("close")){
                        break;
                    }
                    pw.println("response:"+buf);
                    pw.flush();
                }
                System.out.println("close client");
                br.close();
                pw.close();
                clientSocket.close();

客戶端:

BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
            while(true){
                System.out.print("client: ");
                String buf = sc.nextLine();
                pw.println(buf);
                pw.flush();
                if(buf.equals("close")){
                    break;
                }
                buf= br.readLine();
                System.out.println("server: " + buf);
                if(buf.equals("close")){
                    break;
                }
            }
            br.close();
            pw.close();
            sc.close();
            clientSocket.close();

這樣子就能較為方便的實現(xiàn)服務(wù)端向客戶端發(fā)送信息。

總結(jié)

以上就是今天要講的內(nèi)容,本文實現(xiàn)了使用線程池實現(xiàn)socket編程。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java小程序求圓的周長和面積實例

    Java小程序求圓的周長和面積實例

    這篇文章主要介紹了首先用蒙塔卡洛算法求圓周率近似值,然后根據(jù)此近似值輸出圓的周長和面積,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • Java基于Dijkstra算法實現(xiàn)校園導(dǎo)游程序

    Java基于Dijkstra算法實現(xiàn)校園導(dǎo)游程序

    這篇文章主要為大家詳細(xì)介紹了Java基于Dijkstra算法實現(xiàn)校園導(dǎo)游程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java方法覆蓋重寫實現(xiàn)原理解析

    Java方法覆蓋重寫實現(xiàn)原理解析

    這篇文章主要介紹了Java方法覆蓋重寫實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java的RocketMQ之消息存儲和查詢原理詳解

    Java的RocketMQ之消息存儲和查詢原理詳解

    這篇文章主要介紹了Java的RocketMQ之消息存儲和查詢原理詳解,一臺Broker服務(wù)器只有一個CommitLog文件(組),RocketMQ會將所有主題的消息存儲在同一個文件中,這個文件中就存儲著一條條Message,每條Message都會按照順序?qū)懭?需要的朋友可以參考下
    2024-01-01
  • Nacos服務(wù)實例的權(quán)重設(shè)置方式(以及設(shè)置為0時的作用與場景)

    Nacos服務(wù)實例的權(quán)重設(shè)置方式(以及設(shè)置為0時的作用與場景)

    這篇文章主要介紹了Nacos服務(wù)實例的權(quán)重設(shè)置方式(以及設(shè)置為0時的作用與場景),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Mybatis條件if test如何使用枚舉值

    Mybatis條件if test如何使用枚舉值

    這篇文章主要介紹了Mybatis條件if test如何使用枚舉值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用

    Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用

    本文主要介紹了Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • java基礎(chǔ)之接口組成更新的實現(xiàn)

    java基礎(chǔ)之接口組成更新的實現(xiàn)

    本文主要介紹了java基礎(chǔ)之接口組成更新的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 用java開發(fā)dota英雄最華麗的技能(實例講解)

    用java開發(fā)dota英雄最華麗的技能(實例講解)

    下面小編就為大家分享一篇使用java開發(fā)dota英雄最華麗的技能實例,具有非常好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • java如何將pdf轉(zhuǎn)換成image

    java如何將pdf轉(zhuǎn)換成image

    這篇文章主要為大家詳細(xì)介紹了java如何將pdf轉(zhuǎn)換成image,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論

弋阳县| 宁南县| 台山市| 稻城县| 德格县| 灌阳县| 蒙自县| 四川省| 信阳市| 建平县| 天等县| 门头沟区| 克拉玛依市| 壶关县| 富源县| 神池县| 河北区| 仁化县| 阳高县| 来宾市| 青阳县| 广河县| 沈丘县| 阿合奇县| 嘉黎县| 日喀则市| 微山县| 东乡县| 德惠市| 晋江市| 莆田市| 兴仁县| 丘北县| 涿鹿县| 太白县| 资溪县| 绍兴县| 会理县| 垣曲县| 陵水| 松原市|