一、服务端回传服务类:
นำเข้า 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; // ขนาด (เป็นไบต์) ของ I/O บัฟเฟอร์ซ็อกเก็ตส่วนตัว clientocket; // ซ็อกเก็ตเชื่อมต่อกับตัวบันทึกตัวบันทึกส่วนตัวไคลเอนต์; // Server Logger public echoprotocol (Socket ClientSocket, Logger Logger) {this.clientsocket = clientsocket; this.logger = logger; } โมฆะสาธารณะคงที่ handlechoclient (ซ็อกเก็ต clientsocket, logger logger) {ลอง {// รับอินพุตและเอาต์พุต I/O สตรีมจากซ็อกเก็ตอินพุตสตรีมใน = clientsocket.getInputStream (); outputStream out = clientSocket.getOutputStream (); int recvmsgsize; // ขนาดของข้อความที่ได้รับ int totalByTesechoed = 0; // ไบต์ที่ได้รับจากไบต์ลูกค้า [] echobuffer = ไบต์ใหม่ [bufsize]; // รับบัฟเฟอร์ // รับจนกว่าไคลเอ็นต์จะปิดการเชื่อมต่อระบุโดย -1 ในขณะที่ ((recvmsgsize = in.read (echobuffer))! = -1) {out.write (echobuffer, 0, recvmsgsize); TotalByTesechoed += recvmsgSize; } logger.info ("ไคลเอนต์" + clientsocket.getRemotesocketAddress () + ", สะท้อน" + TotalByTesechoed + "ไบต์"); } catch (ioexception ex) {logger.log (level.warning, "ข้อยกเว้นในโปรโตคอล Echo", ex); } ในที่สุด {ลอง {clientsocket.close (); } catch (ioexception e) {}}} public void run () {handlechoclient (this.clientsocket, this.logger); -二、每个客户端请求都新启一个线程的 TCP 服务端:
นำเข้า java.io.ioException; นำเข้า java.net.serversocket; นำเข้า java.net.socket; นำเข้า java.util.logging.logger; คลาสสาธารณะ tcpechoserverThread {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {// สร้างซ็อกเก็ตเซิร์ฟเวอร์เพื่อยอมรับคำขอการเชื่อมต่อไคลเอนต์ Serversocket ServSock = Serversocket ใหม่ (5500); logger logger = logger.getLogger ("ใช้งานได้จริง"); // เรียกใช้ตลอดกาลยอมรับและวางไข่เธรดสำหรับการเชื่อมต่อแต่ละครั้งในขณะที่ (จริง) {ซ็อกเก็ต clntsock = servsock.accept (); // บล็อกรอการเชื่อมต่อ // เธรดวางไข่เพื่อจัดการเธรดการเชื่อมต่อใหม่ = เธรดใหม่ (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 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {int threadpoolsize = 3; // แก้ไข ThreadPoolSize Final Serversocket ServSock = ใหม่ Serversocket (5500); Logger สุดท้าย logger = logger.getLogger ("ใช้งานได้จริง"); // วางไข่จำนวนเธรดคงที่ไปยังไคลเอนต์บริการสำหรับ (int i = 0; i <threadpoolsize; i ++) {เธรดเธรด = เธรดใหม่ () {โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {ลอง {ซ็อกเก็ต clntsock = servsock.accept (); // รอการเชื่อมต่อ echoprotocol.handleechoclient (clntsock, logger); // จัดการกับมัน} catch (ioexception ex) {logger.log (level.warning, "ลูกค้ายอมรับล้มเหลว", ex); - thread.start (); logger.info ("สร้างและเริ่มต้นเธรด =" + thread.getName ()); -四、使用线程池 (使用ฤดูใบไม้ผลิ 的线程次会有队列、最大线程数、最小线程数和超时时间的概念)
1. 线程池工具类:
นำเข้า java.util.concurrent.*; /** * 任务执行者 * * @author Watson Xu * @Since 1.0.0 <p> 2013-6-8 上午 10:33:09 </p> */ชั้นเรียนสาธารณะ执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于 callable 类型的调用通过封装以后转化为 runnable */public thread newthread (runnable r) {count ++; โมฆะคงที่สาธารณะ Invoke (งาน Runnable, TimeUnit Unit, Long Timeout) โยน TimeoutException, RuntimeException {revoke (งาน, null, หน่วย, หมดเวลา); } สาธารณะคงที่ <t> t เรียกใช้ (งานที่เรียกใช้งานได้, T, TimeUnit Unit, Long Timeout) โยน TimeException, RuntimeException {Future <t> Future = Executor.submit (งาน, ผลลัพธ์); t t = null; ลอง {t = future.get (หมดเวลาหน่วย); } catch (TimeOutException E) {โยน TimeOutException ใหม่ ("เธรดเรียกใช้หมดเวลา ... "); } catch (exception e) {โยน runtimeException ใหม่ (e); } return t; } สาธารณะคงที่ <t> t เรียกใช้ (callable <t> งาน, หน่วย TimeUnit, การหมดเวลายาว) โยน TimeException, RuntimeException {// 这里将任务提交给执行器, 任务已经启动, 这里是异步的。อนาคต <t> future = executor.submit (งาน); // system.out.println ("งาน aready ในเธรด"); t t = null; ลอง { / * * 这里的操作是确认任务是否已经完成, 有了这个操作以后 * 1) 对 revoke () 的调用线程变成了等待任务完成状态 * 2) 主线程可以接收子线程的处理结果 * / t = future.get (หมดเวลา, หน่วย); } catch (TimeOutException E) {โยน TimeOutException ใหม่ ("เธรดเรียกใช้หมดเวลา ... "); } 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; นำเข้า demo.callable.threadpooltaskexecutor; คลาสสาธารณะ tcpeChoserveRexecutor {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {// สร้างซ็อกเก็ตเซิร์ฟเวอร์เพื่อยอมรับคำขอการเชื่อมต่อไคลเอนต์ Serversocket ServSock = Serversocket ใหม่ (5500); logger logger = logger.getLogger ("ใช้งานได้จริง"); // เรียกใช้ตลอดกาลยอมรับและวางไข่เธรดเพื่อให้บริการแต่ละการเชื่อมต่อในขณะที่ (จริง) {ซ็อกเก็ต clntsock = servsock.accept (); // บล็อกรอการเชื่อมต่อ //executorservice.submit( ใหม่ echoprotocol (clntsock, logger)); ลอง {threadpooltaskexecutor.invoke (echoprotocol ใหม่ (clntsock, logger), timeunit.seconds, 3); } catch (exception e) {} //service.execute( ใหม่ timelimitechoprotocol (clntsock, logger)); } / * ไม่ถึง * /}}以上就是本文的全部内容, 查看更多 Java 的语法, 大家可以关注: การคิดใน Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》, 也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。