一、服务端回传服务类 :
импортировать java.io.ioexception; импортировать java.io.inputstream; импортировать java.io.outputstream; импортировать java.net.socket; импортировать java.util.logging.level; импортировать java.util.logging.logger; Общедоступный класс Echoprotocol реализует Runnable {Private Static Final int bufsize = 32; // размер (в байтах) буфера ввода/вывода частного рокета Clientsocket; // Сокет подключится к клиентскому частному регистратору Logger; // Server Logger Public EchoProtocol (Socket Clientsocket, Logger Logger) {this.Clientsocket = ClientSocket; this.logger = logger; } public static void hardereChoclient (Socket Clientsocket, logger logger) {try {// Получить входные и выходные потоки ввода/вывода от Socket InputStream in = clientocketocket.getInputStream (); OutputStream out = clientocketocket.getOutputStream (); int recvmsgsize; // размер полученного сообщения int totalbyteSechoed = 0; // байты, полученные от клиентского байта [] echobuffer = new Byte [bufsize]; // получение буфера // Получение до тех пор, пока клиент не закрывает соединение, указанное -1 while ((recvmsgsize = in.read (echobuffer))! = -1) {out.write (echobuffer, 0, recvmsgsize); TotalByteseChoed += RecvMsgSize; } logger.info ("client" + clientocketocket.getRemoteSocketAddress () + ", echoed" + totalbyteSechoed + "Bytes."); } catch (ioException ex) {logger.log (level.warning, "Исключение в протоколе Echo", Ex); } наконец {try {clientockeock.colose (); } catch (ioException e) {}}} public void run () {hardereChoclient (this.clientsocket, this.logger); }}二、每个客户端请求都新启一个线程的 TCP 服务端 :
импортировать java.io.ioexception; импортировать java.net.serversocket; импортировать java.net.socket; импортировать java.util.logging.logger; открытый класс tcpechoserverthread {public static void main (string [] args) бросает ioException {// Создание сокета сервера для принятия запросов на подключение клиента ServerSocket servock = new Serversocket (5500); Logger logger = logger.getLogger ("Практический"); // запустить навсегда, принимая и порождая поток для каждого соединения, пока (true) {сокет clntsock = servsock.accept (); // Блок ожидание подключения // Поток SPAWN для обработки потока нового подключения = новый поток (новый EchoProtocol (CLNTSOCK, LOGGER)); Thread.Start (); logger.info ("Создано и запустил поток" + Thread.getName ()); } / * Не достигнут * /}}三、固定线程数的 TCP 服务端 :
импортировать java.io.ioexception; импортировать java.net.serversocket; импортировать java.net.socket; импортировать java.util.logging.level; импортировать java.util.logging.logger; открытый класс tcpechoserverpool {public static void main (string [] args) бросает ioException {int threadPoolsize = 3; // FIXED THITEPOOLSIZE FOULAT SERVERSOCKECOCETECT SERVSOCK = NEW Serversocket (5500); final logger logger = logger.getLogger ("Практика"); // порождает фиксированное количество потоков для обслуживания клиентов для (int i = 0; i <threadpoolsize; i ++) {Thread Think = new Thread () {public void run () {while (true) {try {socket clntsock = servsock.accept (); // ждать подключения echoprotocol.handleechoclient (clntsock, logger); // обрабатывать его} catch (ioexception ex) {logger.log (level.warning, "client принять не удалось", ex); }}}}; Thread.Start (); logger.info ("Создано и запустил Thread =" + Thread.getName ()); }}}四、使用线程池 (使用 пружина 的线程次会有队列、最大线程数、最小线程数和超时时间的概念)
1. : :
импортировать java.util.concurrent.*; /** * 任务执行者 * * @author Watson xu * @since 1.0.0 <p> 2013-6-8 上午 10:33:09 </p> */public class threadpooltaskexecutor {private threatpooltaskexecutor () {} private staticerservice executior = expertors executorors = refectory;执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于 Callable 类型的调用通过封装以后转化为 Runnable */public newthread (runnable r) {count ++; public static void invoke (выполняемая задача, единица времени, давний тайм -аут) бросает timeoutexception, runtimeexception {invoke (задача, ноль, единица, тайм -аут); } public static <t> t invoke (выполнение задания, результат t, единица времени, давний тайм -аут), бросает timeoutexception, runtimeexception {future <t> future = executor.submit (задача, результат); T t = null; try {t = future.get (timeout, Unit); } catch (TimeOutException e) {Throw New TimeOutException ("Thread Invoke Timeout ..."); } catch (Exception e) {бросить новое runtimeexception (e); } return t; } public static <t> t invoke (callable <t> задача, единица времени, давний тайм -аут) бросает timeoutexception, runtimeexception {// 这里将任务提交给执行器 , 任务已经启动 , 这里是异步的。 future <t> future = executor.submit (задача); // system.out.println ("задача Aready в потоке"); T t = null; try { / * * 这里的操作是确认任务是否已经完成 , 有了这个操作以后 * 1) 对 invoke () 的调用线程变成了等待任务完成状态 * 2) 主线程可以接收子线程的处理结果 * / t = future.get (timeout, unit); } catch (TimeOutException e) {Throw New TimeOutException ("Thread Invoke Timeout ..."); } catch (Exception e) {бросить новое runtimeexception (e); } return t; }}2. 具有伸缩性的 TCP 服务端 :
импортировать java.io.ioexception; импортировать java.net.serversocket; импортировать java.net.socket; импортировать java.util.concurrent.timeUnit; импортировать java.util.logging.logger; Import Demo.callable.ThreadpooltaskexeCutor; открытый класс tcpechoserverexecutor {public static void main (string [] args) бросает ioException {// Создать сокет сервера, чтобы принять запросы на подключение клиента Serversocket servock = new Serversocket (5500); Logger logger = logger.getLogger ("Практический"); // запустить навсегда, принимая и нерестовые потоки для обслуживания каждого соединения, в то время как (true) {сокет clntsock = servsock.accept (); // блок ожидания подключения //executorservice.submit(new echoprotocol (clntsock, logger)); try {threadpooltaskexecutor.invoke (новый эхопротокол (clntsock, logger), timeUnit.seconds, 3); } catch (Exception e) {} //service.execute(new Timelimitechoprotocol (clntsock, logger)); } / * Не достигнут * /}}以上就是本文的全部内容 , 查看更多 java 的语法 大家可以关注 : : 《Мышление в Java 中文手册》、《 JDK 1,7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1,5 API Java 中文参考手册》 , 也希望大家多多支持武林网。