`
shenjichao2009
  • 浏览: 96085 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中使用连接池管理Socket

    博客分类:
  • Java
阅读更多

/**
*
*/
package com.duoguo.util;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/
public class ConnectionPoolHandler implements Runnable {

private Socket socket;

@SuppressWarnings("unchecked")
private static List pool = new LinkedList();

/**
* 处理连接
*/
public void handleConnection() {
try {

PrintWriter out = new PrintWriter(socket.getOutputStream());

BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));

String line = in.readLine();
BufferedReader bufferedReader = new BufferedReader(new FileReader(
line));

String value = null;
while ((value = bufferedReader.readLine()) != null) {
out.println(value);
}

bufferedReader.close();
out.close();
in.close();

} catch (IOException e) {

e.printStackTrace();

}
}

@SuppressWarnings("unchecked")
public static void processRequest(Socket socket) {
synchronized (pool) {

pool.add(pool.size(), socket);
pool.notifyAll();

}
}

/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
@Override
public void run() {

while (true) {
synchronized (pool) {
while (pool.isEmpty()) {
try {

pool.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}
}
socket = (Socket) pool.remove(0);
}

handleConnection();
}

}

}

 

/**
*
*/
package com.duoguo.socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import com.duoguo.util.ConnectionPoolHandler;

/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/
public class PoolMultiServer {

private int maxConnections;// 最大连接数

private int listenerPort;// 监听端口号

private ServerSocket serverSocket;

/**
* 构造方法
*
* @param maxConnections
* :最大连接数
* @param listenerPort
* :监听端口号
*/
public PoolMultiServer(int maxConnections, int listenerPort) {
this.maxConnections = maxConnections;
this.listenerPort = listenerPort;
}

/**
* 接受连接
*/
public void acceptConnection() {
try {

serverSocket = new ServerSocket(listenerPort, maxConnections);

while (true) {
Socket socket = serverSocket.accept();

handleConnection(socket);
}

} catch (IOException e) {

e.printStackTrace();

}
}

/**
* 处理连接
*
* @param socket
* :套接字
*/
public void handleConnection(Socket socket) {
ConnectionPoolHandler.processRequest(socket);
}

public void setUpHandlers() {
for (int i = 0; i < maxConnections; i++) {
ConnectionPoolHandler connectionPoolHandler = new ConnectionPoolHandler();

new Thread(connectionPoolHandler, "处理器" + i).start();
}
}

/**
* @param args
*/
public static void main(String[] args) {

PoolMultiServer poolMultiServer = new PoolMultiServer(5, 9999);

poolMultiServer.setUpHandlers();

poolMultiServer.acceptConnection();

}

}

 

/**
*
*/
package com.duoguo.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/
public class Client {

private String hostIp;// 客户端主机IP

private int hostPort;// 客户端主机端口号

private BufferedReader in;// 客户端输入流

private PrintWriter out;// 客户端输出流

/**
* 构造方法
*
* @param hostip
* :IP地址
* @param hostPort
* :端口号
*/
public Client(String hostip, int hostPort) {
this.hostIp = hostip;
this.hostPort = hostPort;
}

/**
* 建立连接
*/
public void setUpConnection() {
try {

Socket client = new Socket(hostIp, hostPort);

in = new BufferedReader(new InputStreamReader(client
.getInputStream()));// 客户端输入流

out = new PrintWriter(client.getOutputStream());// 客户端输出流

} catch (UnknownHostException e) {

System.out.println("找不到相应的主机!");
e.printStackTrace();

} catch (IOException e) {

System.out.println("抛出相应的流异常信息");
e.printStackTrace();

}
}

/**
* 获取文件
*
* @param fileName
* :文件名称
* @return String
*/
public String getFile(String fileName) {
StringBuilder sb = new StringBuilder();

out.println(fileName);
out.flush();

String line = null;
try {

System.out.println("客户端连接成功!");
while ((line = in.readLine()) != null) {
sb.append(line + "\n");
}

} catch (IOException e) {

System.out.println("文件读入失败!");
e.printStackTrace();

}

return sb.toString();
}

/**
* 断开连接
*/
public void tearDownConnection() {
try {

out.close();// 关闭输出流
in.close();// 关闭输入流

} catch (IOException e) {

System.out.println("断开连接失败!");
e.printStackTrace();

}
}

/**
* @param args
*/
public static void main(String[] args) {

Client client = new Client("127.0.0.1", 9999);
client.setUpConnection();
String fileContent = client.getFile("D:\\hello.txt");
System.out.println("文件内容为:" + "\n" + fileContent);
client.tearDownConnection();

}

}

如有疑问,请联系我chao.shen@duoguo.cn

分享到:
评论

相关推荐

    java socket连接池 实现

    为了解决这个问题,开发人员通常会使用连接池来管理和复用已建立的Socket连接。 首先,我们来看一下Socket的基本概念。Socket是网络编程中的一个抽象概念,它代表了两台机器间的一个双向通信链路。在Java中,`java...

    java socket连接池

    在Java中,可以使用第三方库如Apache Commons Pool或者HikariCP来实现Socket连接池。这些库提供了完善的连接池管理功能,包括连接的创建、分配、回收以及超时、空闲检测等策略。 实现Socket连接池的步骤大致如下: ...

    socket 客户端连接池实现

    在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或ConcurrentHashMap的数据结构来管理和维护连接。同时,可以结合JMX(Java Management Extensions)进行监控,查看连接...

    socket线程连接池实例

    在我们的Socket线程连接池实例中,`GenericObjectPool`被用来管理Socket对象,确保它们在使用后可以被正确地回收和重用,减少创建和销毁Socket的开销。 **实例详解**: 1. **创建Socket对象**:首先,我们需要定义...

    Java实现Socket长连接和短连接

    在Java编程中,Socket是网络通信的基础,它允许两个应用程序通过TCP/IP协议进行数据传输。Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short ...

    Socket连接池的简单应用

    下面是一段示例代码,展示了如何创建和使用Socket连接池: ```csharp // 定义Socket类 public class XieGouSocket { public Socket m_socket; // Socket对象 public bool m_isFree; // 判断是否空闲 public int ...

    Socket连接池的经典实例

    一个java socket连接池的典型实例 SocketClient,客户端测试类 SocketAdapter继承Socket类,重新封装socket类 SocketConnectionPool,连接池管理类 StartupSocketServer,socket服务器端的主线程,负责监听端口,当有...

    socket池,socket

    Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...

    BIO Socket连接池

    通过阅读`PoolConnectionHandler.java`、`SocketServerPool.java`和`SocketClient.java`的代码,我们可以深入了解BIO Socket连接池的实现细节,包括线程安全、连接分配策略、连接状态检测等技术。同时,这也为我们...

    如何解决线程太多导致java socket连接池出现的问题

    在Java应用程序中,线程太多可能会导致Socket连接池出现问题。这是因为每个线程都需要占用一定的系统资源,如内存、CPU、Socket 等。如果线程数量太多,将会导致系统资源不足,从而影响Socket连接池的正常工作。 ...

    Java网络编程-多线程,连接池

    Java网络编程是构建分布式应用程序的关键技术,特别是在服务器端开发中,多线程和连接池是其核心概念。本文将深入探讨这两个主题,并结合文件传输的实际应用进行讲解。 首先,我们来理解多线程。在Java中,多线程...

    socket连接池加消息队列源码

    Socket连接池和消息队列是两种在分布式系统和网络编程中常见的技术,它们在提高系统性能、优化资源管理和实现异步通信方面起着至关重要的作用。在这个“socket连接池加消息队列源码”中,我们可以看到作者创建了一个...

    一个Socket连接管理器

    1. **连接池**:为了提高性能,管理器通常会使用连接池技术,预先创建并保持一定数量的Socket连接,避免每次客户端请求时都需要新建连接的开销。 2. **并发处理**:管理器需要能同时处理多个客户端的连接请求,这...

    mongo设置连接池

    每当执行数据库操作(如增删改查等)时,连接池会分配一个连接给该操作,操作完成后则释放连接回到连接池中,供后续操作使用。 #### 二、连接池的重要参数及设置 MongoDB连接池提供了多个关键参数来控制其行为,合理...

    Java的socket长连接实例

    这个类可能负责管理和维护Socket连接池,它可能包含以下功能: 1. 创建Socket连接:根据服务器地址和端口号创建Socket实例。 2. 连接管理:保存和检索已建立的Socket连接,避免频繁创建和销毁。 3. 连接池维护:...

    安卓Java Web Socket简单使用

    但是,实际应用可能涉及更复杂的逻辑,如多线程处理、消息序列化、连接池管理等。为了优化性能和用户体验,可以使用如Retrofit、OkHttp等库与其他网络API结合使用,或者构建自己的消息队列和处理机制。在`java-web-...

    java socket 经典教程

    Java的`java.sql.DriverManager`就提供了连接池的支持,但需要第三方库如Apache Commons Pool来实现Socket连接池。 9. **SSL/TLS安全通信** - Java提供`SSLSocket`和`SSLServerSocket`类支持安全的HTTPS通信,利用...

    Java实现基于TCP协议的Socket通信

    本篇文章将详细探讨如何使用Java实现基于TCP协议的Socket通信,包括服务器端与客户端的连接以及客户端之间的连接。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它通过三次...

    数据库连接池BoneCP源码分析报告

    BoneCP是一款高效、轻量级的Java数据库连接池实现,它的源码分析对于我们理解数据库连接池的工作原理,优化数据库性能以及进行二次开发具有重要意义。 首先,我们需要了解数据库连接池的基本概念。数据库连接池是...

    java_pda_http_socket.rar_java PDA_java pda sock_java连接pda_服务器 数据

    需要注意的是,由于PDA资源有限,通常会采用轻量级的数据库连接池管理策略,以及优化SQL语句和数据传输,以降低功耗和提高性能。 4. **文件www.pudn.com.txt**: 这可能是一个包含资源链接或说明的文本文件,通常...

Global site tag (gtag.js) - Google Analytics