热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSocket编程实例TCP服务端线程池

一、服务端回传服务类:importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;

一、服务端回传服务类:

import 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;   public class EchoProtocol implements Runnable {   private static final int BUFSIZE = 32; // Size (in bytes) of I/O buffer   private Socket clientSocket; // Socket connect to client   private Logger logger; // Server logger     public EchoProtocol(Socket clientSocket, Logger logger) {     this.clientSocket = clientSocket;     this.logger = logger;   }     public static void handleEchoClient(Socket clientSocket, Logger logger) {     try {       // Get the input and output I/O streams from socket       InputStream in = clientSocket.getInputStream();       OutputStream out = clientSocket.getOutputStream();         int recvMsgSize; // Size of received message       int totalBytesEchoed = 0; // Bytes received from client       byte[] echoBuffer = new byte[BUFSIZE]; // Receive Buffer       // Receive until client closes connection, indicated by -1       while ((recvMsgSize = in.read(echoBuffer)) != -1) {         out.write(echoBuffer, 0, recvMsgSize);         totalBytesEchoed += recvMsgSize;       }         logger.info("Client " + clientSocket.getRemoteSocketAddress() + ", echoed " + total本文来源gaodai$ma#com搞$代*码*网(BytesEchoed + " bytes.");             } catch (IOException ex) {       logger.log(Level.WARNING, "Exception in echo protocol", ex);     } finally {       try {         clientSocket.close();       } catch (IOException e) {       }     }   }     public void run() {     handleEchoClient(this.clientSocket, this.logger);   } }

二、每个客户端请求都新启一个线程的Tcp服务端:

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Logger;   public class TCPEchoServerThread {     public static void main(String[] args) throws IOException {     // Create a server socket to accept client connection requests     ServerSocket servSock = new ServerSocket(5500);       Logger logger = Logger.getLogger("practical");       // Run forever, accepting and spawning a thread for each connection     while (true) {       Socket clntSock = servSock.accept(); // Block waiting for connection       // Spawn thread to handle new connection       Thread thread = new Thread(new EchoProtocol(clntSock, logger));       thread.start();       logger.info("Created and started Thread " + thread.getName());     }     /* NOT REACHED */  } }

三、固定线程数的Tcp服务端:

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger;   public class TCPEchoServerPool {   public static void main(String[] args) throws IOException {     int threadPoolSize = 3; // Fixed ThreadPoolSize       final ServerSocket servSock = new ServerSocket(5500);     final Logger logger = Logger.getLogger("practical");       // Spawn a fixed number of threads to service clients     for (int i = 0; i import java.util.concurrent.*;   /**  * 任务执行者  *  * @author Watson Xu  * @since 1.0.0 

2013-6-8 上午10:33:09

*/public class ThreadPoolTaskExecutor { private ThreadPoolTaskExecutor() { } private static ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() { int count; /* 执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于callable类型的调用通过封装以后转化为runnable */ public Thread newThread(Runnable r) { count++; Thread invokeThread = new Thread(r); invokeThread.setName("Courser Thread-" + count); invokeThread.setDaemon(false);// //???????????? return invokeThread; } }); public static void invoke(Runnable task, TimeUnit unit, long timeout) throws TimeoutException, RuntimeException { invoke(task, null, unit, timeout); } public static T invoke(Runnable task, T result, TimeUnit unit, long timeout) throws TimeoutException, RuntimeException { Future future = executor.submit(task, result); T t = null; try { t = future.get(timeout, unit); } catch (TimeoutException e) { throw new TimeoutException("Thread invoke timeout ..."); } catch (Exception e) { throw new RuntimeException(e); } return t; } public static T invoke(Callable task, TimeUnit unit, long timeout) throws TimeoutException, RuntimeException { // 这里将任务提交给执行器,任务已经启动,这里是异步的。 Future future = executor.submit(task); // System.out.println("Task aready in thread"); T t = null; try { /* * 这里的操作是确认任务是否已经完成,有了这个操作以后 * 1)对invoke()的调用线程变成了等待任务完成状态 * 2)主线程可以接收子线程的处理结果 */ t = future.get(timeout, unit); } catch (TimeoutException e) { throw new TimeoutException("Thread invoke timeout ..."); } catch (Exception e) { throw new RuntimeException(e); } return t; } }

2.具有伸缩性的Tcp服务端:

import java.io.IOException; import java.net.ServerSocket; import 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) throws IOException {     // Create a server socket to accept client connection requests     ServerSocket servSock = new ServerSocket(5500);       Logger logger = Logger.getLogger("practical");           // Run forever, accepting and spawning threads to service each connection     while (true) {       Socket clntSock = servSock.accept(); // Block waiting for connection       //executorService.submit(new EchoProtocol(clntSock, logger));       try {         ThreadPoolTaskExecutor.invoke(new EchoProtocol(clntSock, logger), TimeUnit.SECONDS, 3);       } catch (Exception e) {       }        //service.execute(new TimelimitEchoProtocol(clntSock, logger));     }     /* NOT REACHED */  } }

更多Java Socket编程实例- TCP服务端线程池相关文章请关注!



推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
男儿有志不言苦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有