一、服务端回传服务类 :
importieren java.io.ioException; importieren java.io.inputstream; importieren java.io.outputstream; importieren java.net.socket; import Java.util.logging.level; import Java.util.logging.logger; öffentliche Klasse Echoprotocol implementiert runnable {private statische endgültige int bufsize = 32; // Größe (in Bytes) von E/A Puffer Private Socket Clientocket; // Socket Connect to Client Private Logger Logger; // Server -Logger public eChoprotocol (Socket Clientocket, Logger Logger) {this.clientsocket = Clientsocket; this.logger = logger; } public static void handleChoclient (Socket Clientocket, Logger Logger) {try {// Die Eingabe- und Ausgabe -E/A -Streams aus Socket InputStream in = clientsocket.getInputStream (); OutputStream out = clientsocket.getOutputStream (); int recvmsgSize; // Größe der empfangenen Nachricht int TotalByTesEchoed = 0; // Bytes von Client Byte [] eChobuffer = new Byte [bufsize] erhalten; // Puffer empfangen // Empfangen Sie, bis der Client die Verbindung schließt, angegeben durch -1 while ((recvmsgsize = in.read (echobuffer))! TotalByTeSchoed += recvmsgSize; } logger.info ("client" + clientsocket.getRemotesocketAddress () + ", wiederholte" + TotalByTesechoed + "Bytes."); } catch (ioException ex) {logger.log (Level.warning, "Ausnahme im Echo -Protokoll", ex); } endlich {try {Clientsocket.CLOSE (); } catch (ioException e) {}}} public void run () {handleChoclient (this.clientSocket, this.logger); }}二、每个客户端请求都新启一个线程的 TCP 服务端 :
importieren java.io.ioException; importieren java.net.serversocket; importieren java.net.socket; import Java.util.logging.logger; public class tcpechoServerthread {public static void main (String [] args) löst IOException aus {// Erstellen Sie einen Server -Socket, um Client -Verbindungsanforderungen ServerSocket Servsock = New ServerSocket (5500) zu akzeptieren. Logger logger = logger.getLogger ("praktisch"); // für jede Verbindung einen Thread annehmen und laichen, während (wahr) {Socket clntsock = servsock.accept (); // Warten auf Verbindung // Spawn -Thread, um einen neuen Verbindungs -Thread zu verarbeiten = neuer Thread (neuer Echoprotokol (CLNTSOCK, LOGGER)); Thread.Start (); logger.info ("erstellt und startete Thread" + thread.getName ()); } / * Nicht erreicht * /}}三、固定线程数的 TCP 服务端 :
importieren java.io.ioException; importieren java.net.serversocket; importieren java.net.socket; import Java.util.logging.level; import Java.util.logging.logger; public class tcpechoServerpool {public static void main (String [] args) löscht ioException {int threadpoolsize = 3; // Fix threadPoolSize Final ServerSocket Servsock = New ServerSocket (5500); Final Logger logger = logger.getLogger ("praktisch"); // Laiche eine feste Anzahl von Threads an Service -Clients für (int i = 0; i <threadpoolsize; i ++) {Thread thread = new Thread () {public void run () {while (true) {try {socket clntsock = servsock.accept (); // Warten Sie auf eine Verbindung echoprotocol.Handleechoclient (clntsock, logger); // IT} catch (ioException ex) {logger.log (Level.Warning, "Client Accept fehlgeschlagen", Ex); }}}}; Thread.Start (); logger.info ("erstellt und startete Thread =" + thread.getName ()); }}}四、使用线程池 (使用 Spring 的线程次会有队列、最大线程数、最小线程数和超时时间的概念)
1. 线程池工具类 :
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 statische Sachverdiener.执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于 Callable 类型的调用通过封装以后转化为 Runnable */public thread thread (runnable r) {count ++; public static void invoke (Runnable Task, Timeunit Unit, Long Timeout) löst TimeoutException, RunTimeException (Invoke (Aufgabe, Null, Einheit, Zeitüberschreitung) aus; } public static <t> t aufrufen (Runnable -Aufgabe, T -Ergebnis, Zeiteinheit, langfristig) löst TimeoutException, RunTimeException {Future <T> Future = Executor.Submit (Aufgabe, Ergebnis) aus; T t = null; try {t = future.get (Timeout, Einheit); } catch (timeoutException e) {neue timeoutexception ("Thread Invoke Timeout ..."); } catch (Ausnahme e) {neue runTimeException (e) werfen; } return t; } public static <t> t invoke (Callable <T> Task, Timeunit Unit, Long Timeout) löscht TimeoutException, RunTimeException {// 这里将任务提交给执行器 , 任务已经启动 , 这里是异步的。 Future <T> Future = Executor.Submit (Aufgabe); // system.out.println ("Task aready in Thread"); T t = null; try { / * * 这里的操作是确认任务是否已经完成 , 有了这个操作以后 * 1) 对 invoke () 的调用线程变成了等待任务完成状态 * 2) 主线程可以接收子线程的处理结果 * / t = Future.get (Timeout, Einheit); } catch (timeoutException e) {neue timeoutexception ("Thread Invoke Timeout ..."); } catch (Ausnahme e) {neue runTimeException (e) werfen; } return t; }}2. 具有伸缩性的 TCP 服务端 :
importieren java.io.ioException; importieren java.net.serversocket; importieren 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) löst IOException aus {// Erstellen Sie einen Server -Socket, um Clientverbindungsanforderungen ServerSocket Servsock = New ServerSocket (5500) zu akzeptieren. Logger logger = logger.getLogger ("praktisch"); // für immer laufen lassen, Threads akzeptieren und laichen, um jede Verbindung zu bedienen, während (wahr) {Socket clntsock = servsock.accept (); // Warten auf Verbindung //executorService.Submit(new Echoprotocol (Clntsock, Logger)); try {threadpooltaskexecutor.invoke (neues Echoprotokol (Clntsock, Logger), TimeUnit.seconds, 3); } catch (Ausnahme e) {} //service.execute(new Timelimitechoprotocol (Clntsock, Logger)); } / * Nicht erreicht * /}}以上就是本文的全部内容 , 查看更多 Java 的语法 , : : 《《Denken in Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。