java socket编程收藏之四(线程池)

【Java TCP/IP Socket】Socket编程大合集 为了方便各位网友学习以及方便自己复习之用,将Java TCP/IP Socket编程系列内容按照学习顺序总结如下: 【Java TCP/IP Socket】Java TCP Socket程编程 【Java TCP/IP Socket】Java UDP Socket编程 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析 【Java TCP/IP Socket】构建和解析自定义协议消息 【Java TCP/IP Socket】基于线程池的TCP服务器 【Java TCP/IP 阅读详情


      [关键字: java socket编程]

 1)Server端
Java代码
import java.io.*;  
import java.net.*;  
public class PooledRemoteFileServer {  
   //服务器能同时处理的活动客户机连接的最大数目  
    protected int maxConnections;  
   //进入的连接的侦听端口  
    protected int listenPort;  
    //将接受客户机连接请求的 ServerSocket   
    protected ServerSocket serverSocket;  
    public PooledRemoteFileServer(int aListenPort, int maxConnections) {  
        listenPort= aListenPort;  
        this.maxConnections = maxConnections;  
    }  
    public void acceptConnections() {  
        try {  
            ServerSocket server = new ServerSocket(listenPort, 5);  
            Socket incomingConnection = null;  
            while(true) {  
                incomingConnection = server.accept();  
                handleConnection(incomingConnection);  
            }  
        }  
        catch(BindException e) {  
            System.out.println("");  
        }  
        catch(IOException e) {  
            System.out.println(""+listenPort);  
        }  
    }  
      
    /** 
     * 委派PooledConnectionHandler处理连接 
     */ 
    protected void handleConnection(Socket connectionToHandle) {  
        PooledConnectionHandler.processRequest(connectionToHandle);  
    }  
      
    /** 
     * 创建maxConnections个PooledConnectionHandler并在新Thread中激活它们。 
     * PooledConnectionHandler将等着处理进入的连接,每个都在它自己的Thread中进行。 
     */ 
    public void setUpHandlers() {  
        for(int i=0; i<maxConnections; i++) {  
            PooledConnectionHandler currentHandler = new PooledConnectionHandler();  
            new Thread(currentHandler, "Handler " + i).start();  
        }  
    }  
    public static void main(String args[]) {  
        PooledRemoteFileServer server = new PooledRemoteFileServer(1001, 3);  
        server.setUpHandlers();   
        server.acceptConnections();  
    }  
} 

import java.io.*;
import java.net.*;
public class PooledRemoteFileServer {
   //服务器能同时处理的活动客户机连接的最大数目
    protected int maxConnections;
   //进入的连接的侦听端口
    protected int listenPort;
    //将接受客户机连接请求的 ServerSocket
    protected ServerSocket serverSocket;
    public PooledRemoteFileServer(int aListenPort, int maxConnections) {
        listenPort= aListenPort;
        this.maxConnections = maxConnections;
    }
    public void acceptConnections() {
        try {
            ServerSocket server = new ServerSocket(listenPort, 5);
            Socket incomingConnection = null;
            while(true) {
                incomingConnection = server.accept();
                handleConnection(incomingConnection);
            }
        }
        catch(BindException e) {
            System.out.println("");
        }
        catch(IOException e) {
            System.out.println(""+listenPort);
        }
    }
   
    /**
     * 委派PooledConnectionHandler处理连接
     */
    protected void handleConnection(Socket connectionToHandle) {
        PooledConnectionHandler.processRequest(connectionToHandle);
    }
   
    /**
     * 创建maxConnections个PooledConnectionHandler并在新Thread中激活它们。
     * PooledConnectionHandler将等着处理进入的连接,每个都在它自己的Thread中进行。
     */
    public void setUpHandlers() {
        for(int i=0; i<maxConnections; i++) {
            PooledConnectionHandler currentHandler = new PooledConnectionHandler();
            new Thread(currentHandler, "Handler " + i).start();
        }
    }
    public static void main(String args[]) {
        PooledRemoteFileServer server = new PooledRemoteFileServer(1001, 3);
        server.setUpHandlers();
        server.acceptConnections();
    }
}


(2)实现线程池的类
Java代码
import java.io.*;  
import java.net.*;  
import java.util.*;  
public class PooledConnectionHandler implements Runnable {  
    //connection是当前正在处理的 Socket   
    protected Socket connection;  
    //静态 LinkedList 保存需被处理的连接,工作队列  
    protected static List pool = new LinkedList();  
    public PooledConnectionHandler() {}  
    /** 
     * 将攫取连接的流,使用它们,并在任务完成之后清除它们 
     */ 
    public void  handleConnection() {  
        try {  
            PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());   
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));   
            String fileToRead = streamReader.readLine();  
            BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));  
            String line = null;  
            while((line=fileReader.readLine())!=null)  
                streamWriter.println(line);   
            fileReader.close();  
            streamWriter.close();  
            streamReader.close();  
        }  
        catch(FileNotFoundException e) {  
            System.out.println("");  
        }  
        catch(IOException e) {  
            System.out.println(""+e);  
        }  
    }  
    /** 
     * 将把传入请求添加到池中,并告诉其它正在等待的对象该池已经有一些内容 
     * @param requestToHandle 
     */   
    @SuppressWarnings("unchecked")  
    public static void processRequest(Socket requestToHandle) {  
        //确保没有别人能跟我们同时修改连接池  
        synchronized(pool) {  
            //把传入的Socket添加到LinkedList的尾端  
            pool.add(pool.size(), requestToHandle);  
            //通知其它正在等待该池的Thread,池现在已经可用  
            pool.notifyAll();  
        }  
    }  
    public void run() {  
        while(true) {  
            synchronized(pool) {  
                while(pool.isEmpty()) {  
                    try {  
                        //对池上的wait()的调用释放锁,而wait()接着就在自己返回之前再次攫取该锁  
                        pool.wait();//在连接池上等待,并且池中一有连接就处理它  
                    }  
                    catch(InterruptedException e) {  
                        e.printStackTrace();   
                    }  
                }  
                //恰巧碰上非空池的处理程序将跳出while(pool.isEmpty())循环并攫取池中的第一个连接  
                connection= (Socket)pool.remove(0);   
            }  
            handleConnection();  
        }  
    }  
} 

import java.io.*;
import java.net.*;
import java.util.*;
public class PooledConnectionHandler implements Runnable {
    //connection是当前正在处理的 Socket
 protected Socket connection;
 //静态 LinkedList 保存需被处理的连接,工作队列
    protected static List pool = new LinkedList();
    public PooledConnectionHandler() {}
    /**
     * 将攫取连接的流,使用它们,并在任务完成之后清除它们
     */
    public void  handleConnection() {
        try {
            PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String fileToRead = streamReader.readLine();
            BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
            String line = null;
            while((line=fileReader.readLine())!=null)
                streamWriter.println(line);
            fileReader.close();
            streamWriter.close();
            streamReader.close();
        }
        catch(FileNotFoundException e) {
            System.out.println("");
        }
        catch(IOException e) {
            System.out.println(""+e);
        }
    }
 /**
  * 将把传入请求添加到池中,并告诉其它正在等待的对象该池已经有一些内容
  * @param requestToHandle
  */ 
    @SuppressWarnings("unchecked")
 public static void processRequest(Socket requestToHandle) {
     //确保没有别人能跟我们同时修改连接池
        synchronized(pool) {
         //把传入的Socket添加到LinkedList的尾端
            pool.add(pool.size(), requestToHandle);
            //通知其它正在等待该池的Thread,池现在已经可用
            pool.notifyAll();
        }
    }
    public void run() {
        while(true) {
            synchronized(pool) {
                while(pool.isEmpty()) {
                    try {
                     //对池上的wait()的调用释放锁,而wait()接着就在自己返回之前再次攫取该锁
                        pool.wait();//在连接池上等待,并且池中一有连接就处理它
                    }
                    catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //恰巧碰上非空池的处理程序将跳出while(pool.isEmpty())循环并攫取池中的第一个连接
                connection= (Socket)pool.remove(0);
            }
            handleConnection();
        }
    }
}

(3)Client端
Java代码
import java.io.*;  
import java.net.*;  
/** 
 *   用您想连接的机器的 IP 地址和端口实例化 Socket。 
 *   获取 Socket 上的流以进行读写。 
 *   把流包装进 BufferedReader/PrintWriter 的实例,如果这样做能使事情更简单的话。 
 *   对 Socket 进行读写。 
 *   关闭打开的流。  
 * @author Administrator 
 */ 
public class RemoteFileClient {  
    protected BufferedReader socketReader;  
    protected PrintWriter socketWriter;  
    protected String hostIp;  
    protected int hostPort;  
    /** 
     * 构造方法 
     */ 
    public RemoteFileClient(String hostIp, int hostPort) {  
        this.hostIp = hostIp;  
        this.hostPort=hostPort;   
    }  
    /** 
     * 向服务器请求文件的内容,告诉服务器我们想要什么文件并在服务器传回其内容时接收该内容 
     */ 
    public String getFile(String fileNameToGet) {  
        StringBuffer fileLines = new StringBuffer();  
        try {  
            socketWriter.println(fileNameToGet);              
            socketWriter.flush();  
            String line = null;  
            while((line=socketReader.readLine())!=null)  
                fileLines.append(line+"/n");  
        }  
        catch(IOException e) {  
            System.out.println("Error reading from file: "+fileNameToGet);  
        }  
        return fileLines.toString();  
    }  
    /** 
     * 连接到远程服务器,创建我们的 Socket 并让我们访问该套接字的流 
     */ 
    public void setUpConnection() {  
        try {  
            Socket client = new Socket(hostIp,hostPort);  
            socketReader = new BufferedReader(new InputStreamReader(client.getInputStream()));  
            socketWriter = new PrintWriter(client.getOutputStream());  
        }  
        catch(UnknownHostException e) {  
            System.out.println("Error1 setting up socket connection: unknown host at "+hostIp+":"+hostPort);  
        }  
        catch(IOException e) {  
            System.out.println("Error2 setting up socket connection: "+e);  
        }  
    }  
    /** 
     * 使用完毕连接后负责“清除”。 
     */ 
    public void tearDownConnection() {  
        try {  
            socketWriter.close();   
            socketReader.close();  
        }catch(IOException e) {              
            System.out.println("Error tearing down socket connection: "+e);  
        }  
    }  
    public static void main(String args[]) {  
        RemoteFileClient remoteFileClient = new RemoteFileClient("127.0.0.1",1001);  
        remoteFileClient.setUpConnection();  
        StringBuffer fileContents = new StringBuffer();  
        fileContents.append(remoteFileClient.getFile("D:/test.txt"));          
        //remoteFileClient.tearDownConnection();  
        System.out.println(fileContents);  
    }  
} 

【Java TCP/IP Socket】Socket编程知识点总结 转载请注明出处: TCP/IP Sockets in java 读书笔记 第1章:简介 1、协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析。 2、TCP/IP协议族有IP协议、TCP协议和UDP协议。 3、TCP协议和UDP协议使用的地址叫做端口号,用来区分同一主机上的不同应用程序。TCP协议和UDP协议也 阅读详情

相关推荐

java socket连接池 实现

NULL 博文链接:https://516100981.iteye.com/blog/2314314

java socket 实现客户端、服务端(while、线程、线程池)

友情提示:SocketServer是服务端,SocketClient是客户端,先运行服务端再运行客户端,在客户端输入信息可在服务端返回,实现最简单的交互服务。 While 实现 socket 编程 C/S 结构 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStrea

百般回首曾经的相遇,留下的只是一缕残忆 1028

java socket(线程池)

是一个java在进行socket编程时,关于线程池的介绍,有代码和例子

while循环+线程池

public class VolatileTest2 { private static volatile int ticket = 10; public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(5); while (ticket > 0) .

zhangustb 2061

java socket线程池

package multithread3; import java.io.*; import java.net.*;  import java.util.concurrent.*; public class EchoServer {   private int port=8000;    private ServerSocket serverSocket;    private ExecutorService executorService;                        //线程池    private final int POOL_SIZE=4;                                     //单个CPU时线程池中工作线程的数目    public EchoServer() throws IOException {     serverSocket = new ServerSocket(port);     //创建线程池      //Runtime的availableProcessors()方法返回当前系统的CPU的数目     //系统的CPU越多,线程池中工作线程的数目也越多     executorService= Executors.newFixedThreadPool(                 Runtime.getRuntime().availableProcessors() * POOL_SIZE);     System.out.println("服务器启动");   }    public void service() {     while (true) {       Socket socket=null;       try {          socket = serverSocket.accept();          executorService.execute(new Handler(socket));       }catch (IOException e) {          e.printStackTrace();       }     }   }    public static void main(String args[])throws IOException {     new EchoServer().service();   } 

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

Java学习小记——多线程&Socket编程

在创建一个线程时存在一定的开销,创建线程的开销相比于一般的算法来说较大。首先需要建立一个调用栈,接着操作系统还需要建立很多数据结构来维护线程的状态等等。为了解决每次都需要临时创建线程带来开销的问题,引入了线程池。线程池会预先建立好线程,等待任务派发。一个线程池内可能会有几十上百个闲置的线程,当有任务来临时,需要选中一个线程执行任务。执行完毕后释放该线程资源,重新回到闲置状态,等待下一个任务。在线程池中,通常有一个Blocking Queue用来派发任务。

ignb6666的博客 2312

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

unique_sir的博客 1万+

Java 源码 - 工作实战:Socket 结合线程池的使用

不啰嗦,我们直接开始! 引导语 Socket 面试最终题一般都是让你写一个简单的客户端和服务端通信的例子,本文就带大家一起来写这个 demo。 1、要求 可以使用 Socket 和 ServiceSocket 以及其它 API; 写一个客户端和服务端之间 TCP 通信的例子; 服务端处理任务需要异步处理; 因为服务端处理能力很弱,只能同时处理 5 个请求,当第六个请求到达服务器时,需要服务器返回明确的错误信息:服务器太忙了,请稍后重试~。 需求比较简单,唯一复杂的地方在于第四点,我们需要对客户

。 20万+

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2250

Java Socket 网络编程实战:从基础通信到线程池优化

本文系统介绍了Java Socket网络编程的核心技术,从基础实现到性能优化逐步深入。首先讲解了Socket作为应用层与传输层接口的基本概念和TCP通信模型。随后通过单客户端示例展示ServerSocket和Socket的基础用法,并指出其单线程处理的局限性。接着引入多线程方案实现并发通信,最后通过线程池优化解决高并发场景下的资源管理问题。文章完整呈现了Socket通信从单线程到多线程再到线程池优化的演进路径,为网络编程学习提供了清晰的实践框架。核心在于通过线程复用和并发控制实现高效稳定的通信服务,为分布式

2503_93734861的博客 1214

【AUTOSAR-DEM】-2.1-APP SWC设置UDS/OBD DTC检出和恢复

点击返回「《Autosar_BSW高阶配置》总目录」 案例背景(共6页精讲): DEM模块提供两种不同类型的Event: • BSW-related events:DEM_EVENT_KIND_BSW(通过C-API报告 - Dem_SetEventStatus) • SW-C-related events:DEM_EVENT_KIND_SWC(通过RTE operation - SetEventStatus) 下面我们讲讲在APP SWC中设置BusOff(总线关闭) DTC故障成立/恢复(其它

「汽车电子助手」的博客 3944

Java 网络编程之Socket详解

Java Socket概念TCPJava SocketSocket APITCP编程服务器端客户端多线程实现服务器与多客户端之间通信步骤Socket通信基本示例基础模式双向通信,发送消息并接收消息如何告知对方已发送完命令服务端优化结语   同学们,今天我们来一起学习Java网络编程里的socket,通过本文的内容,我们就能掌握socket的基本概念以及基本使用。 概念 TCP TCP(传输控制协议)是面向连接的可靠的,基于字节流的传输通信协议。在简化的计算机网络OSI模型中(如下图所示),它完成第四层传输层

ᶻᶻᶻ 枕星河的博客 6864

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

化工过程设计软件:Aspen Plus二次开发_(2).二次开发概述

假设我们需要创建一个自定义的换热器模型,该模型能够计算两个物流之间的热交换量,并根据传热系数和换热面积进行调整。ACM 模型代码示例!自定义换热器模型!参数:传热系数 U (W/m^2·K)!换热面积 A (m^2)!热物流 T_hot_in (K), T_hot_out (K), F_hot (kmol/h)!冷物流 T_cold_in (K), T_cold_out (K), F_cold (kmol/h)!模型输入!U - 传热系数!A - 换热面积!

kkchenjj的博客 370

Java Socket编程

Socket(套接字)是网络通信的抽象端点,是支持TCP/IP协议的网络通信的基本操作单元。在Java中,Socket和ServerSocket类分别用于客户端和服务器端的网络通信。// 服务器端创建ServerSocket// 客户端创建Socket连接Socket基础:理解Socket的基本概念和通信机制是网络编程的基础多线程必要性:为支持并发连接,必须使用多线程处理Socket传统多线程的局限:线程创建销毁开销大、管理复杂、稳定性差线程池的优势:资源复用、提高响应速度、更好的可管理性。

Aayu_的博客 1194

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java:使用线程池实现socket编程

文章目录前言一、实现最简单的C/S模型二、使用步骤1.引入库2.读入数据总结 前言 以多个客户端和一个服务端的socket通信为例,服务端启动时创建一个固定大小的线程池。服务端每接收到一个连接请求后(通信任务),交给线程池执行,任务类实现了Runnable接口,用于跟客户端进行读写操作,该类的对象作为任务通过execute(Runnable task)提交给线程池。 一、实现最简单的C/S模型 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引

weixin_47805561的博客 2297

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java Socket 网络编程实战(含线程池优化)

Socket是计算机网络中进行进程间通信的核心技术,它作为通信端点封装了底层协议复杂性,提供标准API接口。本文系统介绍了Socket的概念、工作原理及在OSI模型中的位置,并详细展示了Java实现的Socket通信开发流程:从基础单向通信到多客户端并发处理,再到线程池优化方案。通过ServerSocket和Socket类实现TCP连接,利用输入输出流进行数据传输,采用线程池解决并发性能问题。

2302_80192044的博客 1411

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java入门级教程22——Socket编程

本文介绍了Java Socket编程的逐步演进过程,从基础通信到高并发处理:1.基础实现:展示了TCP/IP一问一答式通信模型,包含服务器端和客户端的基本实现,完成消息收发。2.持续通信:改进为while循环,实现客户端与服务器的多次交互。3.多线程处理:引入线程机制,使服务器能同时处理多个客户端请求,解决单线程阻塞问题。4.线程池优化:使用线程池,避免线程爆炸问题,提升服务器性能和稳定性。5.自定义线程池:实现完整的线程池架构,包含任务队列和线程管理功能。

weixin_74137141的博客 1377

java线程池实例及总结(以多路socket通信为例)

(一)线程池概念 我们知道,多线程是针对多任务处理的,可以多线程可以并发执行多个任务,提高了程序执行效率。但是线程的创建和销毁需要时间,如果频繁创建和销毁线程,可能会影响执行效率,线程池可以解决这个问题。顾名思义,线程池可以理解为一个预先创建的线程集合,每次有任务来的时候,从线程池中取得一个线程去执行任务(如果线程池无空闲线程,可能要新建线程或者等待),执行完毕后线程暂不销毁,等待执行下一个任务...

poetteaes的博客 9978
上一篇: Flash Remoting的原理类似于--转
下一篇: java多线程编程的常见陷阱
hacktt
博客等级 码龄19年 21粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值