:
Importer 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; La classe publique EchoprotoCol implémente Runnable {private static final int bufsize = 32; // Taille (en octets) de Buffer Private Socket de Buffer ClientSocket; // socket se connecter au journal de connexion privé du client; // Server Logger public eChoprotoCol (socket clientSocket, logger logger) {this.clientsocket = client; this.logger = logger; } public static void handleeChoClient (socket clientSocket, logger logger) {try {// Obtenez les flux d'E / S d'entrée et de sortie de socket inputStream dans = ClientSocket.getInputStream (); OutputStream out = ClientSocket.getOutputStream (); int recvmsgsize; // Taille du message reçu int totalByteSechoed = 0; // octets reçus de l'octet client [] echobuffer = new octet [bufsize]; // Recevoir le tampon // Recevoir jusqu'à ce que le client ferme la connexion, indiqué par -1 while ((recvmsgsize = in.read (eChobuffer))! = -1) {out.write (eChobuffer, 0, recvmsgsize); TotalByteSeChoed + = recvmsgsize; } logger.info ("client" + clients.getRemotesocketAddress () + ", écho" + totalByteSechoed + "octets."); } catch (ioException ex) {logger.log (niveau.warning, "Exception dans Echo Protocol", ex); } enfin {try {ClientSocket.close (); } catch (ioException e) {}}} public void run () {haineChoClient (this.clientSocket, this.logger); }}二、每个客户端请求都新启一个线程的 TCP 服务端 :
Importer java.io.ioException; import java.net.serversocket; import java.net.socket; import java.util.logging.logger; La classe publique TCPECHOSERVERTHREAD {public static void main (String [] args) lève ioException {// Créer un socket serveur pour accepter les demandes de connexion client Serversocket ServSock = new Serversocket (5500); Logger logger = logger.getLogger ("pratique"); // Exécutez pour toujours, en acceptant et engetant un fil pour chaque connexion tandis que (true) {socket clrstock = servsock.accept (); // Bloc en attente de connexion // Thread Spawn pour gérer le nouveau thread de connexion Thread = nouveau thread (nouvel EchoprotoCol (clrstock, logger)); thread.start (); Logger.info ("Créé et démarré thread" + thread.getName ()); } / * Non atteint * /}}三、固定线程数的 TCP 服务端 :
Importer java.io.ioException; import java.net.serversocket; import java.net.socket; import java.util.logging.level; import java.util.logging.logger; La classe publique TCPECHOSERVERPOOL {public static void main (String [] args) lève ioException {int threadpoolSize = 3; // Fixé ThreadPoolSize final Serversocket ServSock = new SERVERSOCKET (5500); Logger Final Logger = Logger.GetLogger ("Pratique"); // Spawn un nombre fixe de threads pour servir les clients pour (int i = 0; i <threadpoolSize; i ++) {thread thread = new Thread () {public void run () {while (true) {try {socket clrstock = servsock.accept (); // attendez une connexion eChoprotocol.HandleEchoclient (clrstock, logger); // Gire It} catch (ioException ex) {logger.log (niveau.warning, "Client accepte l'échec", ex); }}}}; thread.start (); logger.info ("créé et démarré thread =" + thread.getName ()); }}}四、使用线程池 (使用 printemps 的线程次会有队列、最大线程数、最小线程数和超时时间的概念)
1. : :
importer java.util.concurrent. *; / ** * 任务执行者 * * @Author Watson Xu * @Since 1.0.0 <p> 2013-6-8 上午 10:33:09 </p> * / classe publique ThreadpoolTasKEXECUTOR {private threadpooltasKExECUTOR () {} private static exécutorvice exécutor = exécutor;执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于 CALLable 类型的调用通过封装以后转化为 Runnable * / Public Thread NewThread (Runnable R) {Count ++; Public Static Void invoke (Tâche Runnable, Unit TimeUnit, Long Timeout) lève TimeEutException, RuntimeException {invoke (tâche, null, unité, timeout); } public static <t> t invoke (runnable tâche, t résultat, timeunit unité, long timeout) lève TimeEutException, runtimeException {futur <t> futur = exécutor.submit (tâche, résultat); T t = null; essayez {t = future.get (timeout, unit); } catch (timeoutException e) {lancer un nouveau tempsoutException ("thread invoke timeout ..."); } catch (exception e) {lancer une nouvelle RuntimeException (e); } return t; } public static <t> t invoke (tâche callable <t>, unité de tempsunit, long timeout) lève TimeEutException, runtimeException {// 这里将任务提交给执行器 , 任务已经启动 , 这里是异步的。 futur <T> futur = exécutor.submit (tâche); // system.out.println ("tâche ateady dans thread"); T t = null; essayez {/ * * 这里的操作是确认任务是否已经完成 , 有了这个操作以后 * 1) 对 invoke () 的调用线程变成了等待任务完成状态 * 2) 主线程可以接收子线程的处理结果 * / t = futur.get (timeout, unit); } catch (timeoutException e) {lancer un nouveau tempsoutException ("thread invoke timeout ..."); } catch (exception e) {lancer une nouvelle RuntimeException (e); } return t; }}2. 具有伸缩性的 TCP 服务端:
Importer java.io.ioException; import java.net.serversocket; import java.net.socket; Importer java.util.concurrent.TimeUnit; import java.util.logging.logger; Importer Demo.Callable.ThreadpoolTaskExECUTOR; La classe publique TCPECHOSERVEREXECUTOR {public static void main (String [] args) lève ioException {// Créer un socket serveur pour accepter les demandes de connexion du client Serversocket ServSock = new Serversocket (5500); Logger logger = logger.getLogger ("pratique"); // Exécutez pour toujours, en acceptant et engetant des threads pour desservir chaque connexion tandis que (true) {socket clrstock = servsock.accept (); // Bloc en attente de connexion //ExecutorService.Submit(New eChoprotocol (Clntsock, Logger)); essayez {threadpooltaskexecutor.invoke (new echoprotocol (clrstock, logger), timeunit.seconds, 3); } catch (exception e) {} //service.execute(New timelimitechoprotocol (clrstock, logger)); } / * Non atteint * /}}°