国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Java Socket編程實例(三)- TCP服務端線程池

Java Socket編程實例(三)- TCP服務端線程池

2020-05-17 12:17kingxss JAVA教程

這篇文章主要講解Java Socket編程中TCP服務端線程池的實例,希望能給大家做一個參考。

一、服務端回傳服務類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class EchoProtocol implements Runnable {
  private static final int BUFSIZE = 32; // Size (in bytes) of I/O buffer
  private Socket clientSocket; // Socket connect to client
  private Logger logger; // Server logger
 
  public EchoProtocol(Socket clientSocket, Logger logger) {
    this.clientSocket = clientSocket;
    this.logger = logger;
  }
 
  public static void handleEchoClient(Socket clientSocket, Logger logger) {
    try {
      // Get the input and output I/O streams from socket
      InputStream in = clientSocket.getInputStream();
      OutputStream out = clientSocket.getOutputStream();
 
      int recvMsgSize; // Size of received message
      int totalBytesEchoed = 0; // Bytes received from client
      byte[] echoBuffer = new byte[BUFSIZE]; // Receive Buffer
      // Receive until client closes connection, indicated by -1
      while ((recvMsgSize = in.read(echoBuffer)) != -1) {
        out.write(echoBuffer, 0, recvMsgSize);
        totalBytesEchoed += recvMsgSize;
      }
 
      logger.info("Client " + clientSocket.getRemoteSocketAddress() + ", echoed " + totalBytesEchoed + " bytes.");
       
    } catch (IOException ex) {
      logger.log(Level.WARNING, "Exception in echo protocol", ex);
    } finally {
      try {
        clientSocket.close();
      } catch (IOException e) {
      }
    }
  }
 
  public void run() {
    handleEchoClient(this.clientSocket, this.logger);
  }
}

二、每個客戶端請求都新啟一個線程的Tcp服務端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;
 
public class TCPEchoServerThread {
 
  public static void main(String[] args) throws IOException {
    // Create a server socket to accept client connection requests
    ServerSocket servSock = new ServerSocket(5500);
 
    Logger logger = Logger.getLogger("practical");
 
    // Run forever, accepting and spawning a thread for each connection
    while (true) {
      Socket clntSock = servSock.accept(); // Block waiting for connection
      // Spawn thread to handle new connection
      Thread thread = new Thread(new EchoProtocol(clntSock, logger));
      thread.start();
      logger.info("Created and started Thread " + thread.getName());
    }
    /* NOT REACHED */
  }
}

三、固定線程數的Tcp服務端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class TCPEchoServerPool {
  public static void main(String[] args) throws IOException {
    int threadPoolSize = 3; // Fixed ThreadPoolSize
 
    final ServerSocket servSock = new ServerSocket(5500);
    final Logger logger = Logger.getLogger("practical");
 
    // Spawn a fixed number of threads to service clients
    for (int i = 0; i < threadPoolSize; i++) {
      Thread thread = new Thread() {
        public void run() {
          while (true) {
            try {
              Socket clntSock = servSock.accept(); // Wait for a connection
              EchoProtocol.handleEchoClient(clntSock, logger); // Handle it
            } catch (IOException ex) {
              logger.log(Level.WARNING, "Client accept failed", ex);
            }
          }
        }
      };
      thread.start();
      logger.info("Created and started Thread = " + thread.getName());
    }
  }
}

四、使用線程池(使用Spring的線程次會有隊列、最大線程數、最小線程數和超時時間的概念)

1.線程池工具類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.util.concurrent.*;
 
/**
 * 任務執行者
 *
 * @author Watson Xu
 * @since 1.0.0 <p>2013-6-8 上午10:33:09</p>
 */
public class ThreadPoolTaskExecutor {
 
  private ThreadPoolTaskExecutor() {
 
  }
 
  private static ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
    int count;
 
    /* 執行器會在需要自行任務而線程池中沒有線程的時候來調用該程序。對于callable類型的調用通過封裝以后轉化為runnable */
    public Thread newThread(Runnable r) {
      count++;
      Thread invokeThread = new Thread(r);
      invokeThread.setName("Courser Thread-" + count);
      invokeThread.setDaemon(false);// //????????????
 
      return invokeThread;
    }
  });
 
  public static void invoke(Runnable task, TimeUnit unit, long timeout) throws TimeoutException, RuntimeException {
    invoke(task, null, unit, timeout);
  }
 
  public static <T> T invoke(Runnable task, T result, TimeUnit unit, long timeout) throws TimeoutException,
      RuntimeException {
    Future<T> future = executor.submit(task, result);
    T t = null;
    try {
      t = future.get(timeout, unit);
    } catch (TimeoutException e) {
      throw new TimeoutException("Thread invoke timeout ...");
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    return t;
  }
 
  public static <T> T invoke(Callable<T> task, TimeUnit unit, long timeout) throws TimeoutException, RuntimeException {
    // 這里將任務提交給執行器,任務已經啟動,這里是異步的。
    Future<T> future = executor.submit(task);
    // System.out.println("Task aready in thread");
    T t = null;
    try {
      /*
       * 這里的操作是確認任務是否已經完成,有了這個操作以后
       * 1)對invoke()的調用線程變成了等待任務完成狀態
       * 2)主線程可以接收子線程的處理結果
       */
      t = future.get(timeout, unit);
    } catch (TimeoutException e) {
      throw new TimeoutException("Thread invoke timeout ...");
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
 
    return t;
  }
}

2.具有伸縮性的Tcp服務端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
 
import demo.callable.ThreadPoolTaskExecutor;
 
 
public class TCPEchoServerExecutor {
 
  public static void main(String[] args) throws IOException {
    // Create a server socket to accept client connection requests
    ServerSocket servSock = new ServerSocket(5500);
 
    Logger logger = Logger.getLogger("practical");
     
    // Run forever, accepting and spawning threads to service each connection
    while (true) {
      Socket clntSock = servSock.accept(); // Block waiting for connection
      //executorService.submit(new EchoProtocol(clntSock, logger));
      try {
        ThreadPoolTaskExecutor.invoke(new EchoProtocol(clntSock, logger), TimeUnit.SECONDS, 3);
      } catch (Exception e) {
      
      //service.execute(new TimelimitEchoProtocol(clntSock, logger));
    }
    /* NOT REACHED */
  }
}

以上就是本文的全部內容,查看更多Java的語法,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
720
主站蜘蛛池模板: 国产精品一二 | 欧美精品久久久久 | 爱色av网 | 久久久国产精品 | 久re在线 | 精品一区二区久久久久久久网站 | 黄色美女网站视频 | 一级一片免费看 | av免费直接看 | 欧美亚洲高清 | 久久久精品一区二区三区 | 欧美日韩一区二区三区在线观看 | 国产999精品久久久久久 | 亚洲精品一区二区在线 | 亚洲综合日韩欧美 | 午夜寂寞影视在线观看 | 久久一区二区视频 | 欧美成人午夜视频 | 午夜在线电影 | 婷婷久久久 | 精品无码久久久久久国产 | 激情综合色综合久久综合 | 青青草免费在线 | 黄色一级网站 | 黄色a视频| 久久精品视频一区 | 天天操,夜夜操 | 一区二区三区高清 | 天天干狠狠操 | 色综合天天综合网国产成人综合天 | 久久久久久久久成人 | 欧美精品一 | 亚洲国产免费 | 亚洲色吧 | 欧美一区二区网站 | 精品伦精品一区二区三区视频 | 亚洲高清精品视频 | 国产精品极品美女在线观看免费 | 一本在线 | 国产精品亚洲精品 | 特及毛片 |