一、服务端回传服务类
importar java.io.ioException; importar java.io.inputStream; importar java.io.OutputStream; importar java.net.socket; importar java.util.logging.level; importar java.util.logging.logger; classe pública Ecoprotocol implementa Runnable {private estático final int bufsize = 32; // tamanho (em bytes) do buffer de E/S Buffer Socket ClientSocket; // soquete conectado ao cliente privado Logger Logger; // servidor Logger public EchoProtocol (Socket ClientSocket, Logger Logger) {this.clientSocket = clientSocket; this.logger = logger; } public static void HandleChoclient (Socket Customerocket, Logger Logger) {Try {// Obtenha os fluxos de E/S de entrada e saída do soquete inputStream em = clientsocket.getInputStream (); OutputStream out = clientsocket.getOutputStream (); int recvmsgSize; // tamanho da mensagem recebida int totalbyteseChoed = 0; // bytes recebidos do cliente byte [] echobuffer = novo byte [bufsize]; // Receba buffer // Receba até que o cliente feche a conexão, indicado por -1 while ((RecvmsgSize = in.read (echobuffer))! = -1) {out.write (echobuffer, 0, recvmsgSize); totalbytesechoed += recvmsgSize; } logger.info ("client" + clientSocket.getRemoteSocketAddress () + ", ecoado" + totalbytesechoed + "bytes."); } catch (ioexception ex) {logger.log (nível.warning, "Exceção no protocolo Echo", ex); } finalmente {try {clusterSocket.close (); } catch (ioexception e) {}}} public void run () {handleChoclient (this.clientSocket, this.logger); }}二、每个客户端请求都新启一个线程的 TCP 服务端:
importar java.io.ioException; importar java.net.serversocket; importar java.net.socket; importar java.util.logging.logger; classe pública tcPechoserverThread {public static void main (string [] args) lança ioexception {// Crie um soquete do servidor para aceitar as solicitações de conexão do cliente ServerSocket Servsock = new ServerSocket (5500); Logger logger = logger.getLogger ("prático"); // executa para sempre, aceitando e gerando um thread para cada conexão enquanto (true) {Socket clntsock = servsock.accept (); // Block Waiting for Connection // Spawn Thread para lidar com o novo thread de conexão = novo thread (novo Echoprotocol (Clntsock, Logger)); thread.start (); logger.info ("criado e iniciado thread" + thread.getName ()); } / * Não alcançado * /}}三、固定线程数的 TCP 服务端:
importar java.io.ioException; importar java.net.serversocket; importar java.net.socket; importar java.util.logging.level; importar java.util.logging.logger; classe pública tcPechoserverpool {public static void main (string [] args) lança ioexception {int threadpoolsize = 3; // Corrigido ThreadPoolSize Final ServerSocket Servsock = new ServerSocket (5500); Final Logger Logger = Logger.getLogger ("Practical"); // gerar um número fixo de threads para atender clientes para (int i = 0; i <threadpoolsize; i ++) {threads = new Thread () {public void run () {while) {tente {socket clntsock = servsock.accept (); // Aguarde por uma conexão ECHOPOTOCOL.HANDLEECHOCLIENT (Clntsock, Logger); // manipulá -lo} catch (ioexception ex) {Logger.log (Level.warning, "O cliente aceita falhou", ex); }}}}; thread.start (); logger.info ("criado e iniciado thread =" + thread.getName ()); }}}四、使用线程池 (使用 Spring 的线程次会有队列、最大线程数、最小线程数和超时时间的概念)
1. 线程池工具类:
importar java.util.Concurrent.*; /** * 任务执行者 * * @author watson xu * @since 1.0.0 <p> 2013-6-8 上午 10:33:09 </p> */public class ThreadPoolTaskexEdor {private threadPoolTaskexecutor () {} STATTIOL (} STATIOL ({} STATIOOL ExecutorReCORDOR = ExecutorS.NewCached执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于 Callable 类型的调用通过封装以后转化为 Runnable */THINE Public Newthread (Runnable R) {Count ++; public static void Invoke (tarefa executável, unidade de unidade de tempo, tempo limite de longa data) lança timeoutException, run timeException {Invoke (tarefa, nulo, unidade, tempo limite); } public static <t> t invocar (tarefa executável, resultado t, unidade de unidade de tempo, tempo limite de longo prazo) lança timeoutException, run timeException {future <t> futuro = executor.submit (tarefa, resultado); T t = nulo; tente {t = futuro.get (tempo limite, unidade); } catch (timeoutException e) {lança nova timeoutException ("thread invoke timeout ..."); } catch (Exceção e) {lança nova RunTimeException (e); } retornar t; } public static <t> t Invoke (Tarefa Callable <T>, Unidade Timeunit, Timeout Longo) lança TimeoutException, RunTimeException {// 这里将任务提交给执行器 , 任务已经启动 , 这里是异步的。 Future <T> Future = Execoror.Submit (Task); // system.out.println ("tarefa aready em thread"); T t = nulo; tente { / * * 这里的操作是确认任务是否已经完成 , 有了这个操作以后 * 1) 对 Invoke () 的调用线程变成了等待任务完成状态 * 2) 主线程可以接收子线程的处理结果 * / t = futuro.get (tempo limite, unidade); } catch (timeoutException e) {lança nova timeoutException ("thread invoke timeout ..."); } catch (Exceção e) {lança nova RunTimeException (e); } retornar t; }}2. 具有伸缩性的 TCP 服务端:
importar java.io.ioException; importar java.net.serversocket; importar java.net.socket; importar java.util.Concurrent.TimeUnit; importar java.util.logging.logger; importação demo.callable.threadpooltaskexecutor; classe pública tcPechoserVerExecutor {public static void main (string [] args) lança ioexception {// Crie um soquete do servidor para aceitar o servidor ServerSocket Servsock = New ServerSocket (5500); Logger logger = logger.getLogger ("prático"); // executa para sempre, aceitando e desova os threads para atender a cada conexão enquanto (true) {soquete clntsock = servsock.accept (); // Block Waiting for Connection //executorService.subMit(new Echoprotocol (Clntsock, Logger)); tente {threadpooltaskexecutor.invoke (novo ecoprotocolo (clntsock, logger), timeunit.seconds, 3); } catch (Exceção e) {} //service.execute(new timelimitechoprotocol (clnttsock, logger)); } / * Não alcançado * /}}以上就是本文的全部内容 , Java 的语法 , 大家可以关注 : : Pensando em Java 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java 中文参考手册》、《 jdk 1.5 api java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。