/**
*
*/
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
分享到:
相关推荐
为了解决这个问题,开发人员通常会使用连接池来管理和复用已建立的Socket连接。 首先,我们来看一下Socket的基本概念。Socket是网络编程中的一个抽象概念,它代表了两台机器间的一个双向通信链路。在Java中,`java...
在Java中,可以使用第三方库如Apache Commons Pool或者HikariCP来实现Socket连接池。这些库提供了完善的连接池管理功能,包括连接的创建、分配、回收以及超时、空闲检测等策略。 实现Socket连接池的步骤大致如下: ...
在Java中,可以使用Apache Commons Pool库来实现Socket连接池,或者自定义一个基于LinkedList或ConcurrentHashMap的数据结构来管理和维护连接。同时,可以结合JMX(Java Management Extensions)进行监控,查看连接...
在我们的Socket线程连接池实例中,`GenericObjectPool`被用来管理Socket对象,确保它们在使用后可以被正确地回收和重用,减少创建和销毁Socket的开销。 **实例详解**: 1. **创建Socket对象**:首先,我们需要定义...
在Java编程中,Socket是网络通信的基础,它允许两个应用程序通过TCP/IP协议进行数据传输。Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short ...
下面是一段示例代码,展示了如何创建和使用Socket连接池: ```csharp // 定义Socket类 public class XieGouSocket { public Socket m_socket; // Socket对象 public bool m_isFree; // 判断是否空闲 public int ...
一个java socket连接池的典型实例 SocketClient,客户端测试类 SocketAdapter继承Socket类,重新封装socket类 SocketConnectionPool,连接池管理类 StartupSocketServer,socket服务器端的主线程,负责监听端口,当有...
Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...
通过阅读`PoolConnectionHandler.java`、`SocketServerPool.java`和`SocketClient.java`的代码,我们可以深入了解BIO Socket连接池的实现细节,包括线程安全、连接分配策略、连接状态检测等技术。同时,这也为我们...
在Java应用程序中,线程太多可能会导致Socket连接池出现问题。这是因为每个线程都需要占用一定的系统资源,如内存、CPU、Socket 等。如果线程数量太多,将会导致系统资源不足,从而影响Socket连接池的正常工作。 ...
Java网络编程是构建分布式应用程序的关键技术,特别是在服务器端开发中,多线程和连接池是其核心概念。本文将深入探讨这两个主题,并结合文件传输的实际应用进行讲解。 首先,我们来理解多线程。在Java中,多线程...
Socket连接池和消息队列是两种在分布式系统和网络编程中常见的技术,它们在提高系统性能、优化资源管理和实现异步通信方面起着至关重要的作用。在这个“socket连接池加消息队列源码”中,我们可以看到作者创建了一个...
1. **连接池**:为了提高性能,管理器通常会使用连接池技术,预先创建并保持一定数量的Socket连接,避免每次客户端请求时都需要新建连接的开销。 2. **并发处理**:管理器需要能同时处理多个客户端的连接请求,这...
每当执行数据库操作(如增删改查等)时,连接池会分配一个连接给该操作,操作完成后则释放连接回到连接池中,供后续操作使用。 #### 二、连接池的重要参数及设置 MongoDB连接池提供了多个关键参数来控制其行为,合理...
这个类可能负责管理和维护Socket连接池,它可能包含以下功能: 1. 创建Socket连接:根据服务器地址和端口号创建Socket实例。 2. 连接管理:保存和检索已建立的Socket连接,避免频繁创建和销毁。 3. 连接池维护:...
但是,实际应用可能涉及更复杂的逻辑,如多线程处理、消息序列化、连接池管理等。为了优化性能和用户体验,可以使用如Retrofit、OkHttp等库与其他网络API结合使用,或者构建自己的消息队列和处理机制。在`java-web-...
Java的`java.sql.DriverManager`就提供了连接池的支持,但需要第三方库如Apache Commons Pool来实现Socket连接池。 9. **SSL/TLS安全通信** - Java提供`SSLSocket`和`SSLServerSocket`类支持安全的HTTPS通信,利用...
本篇文章将详细探讨如何使用Java实现基于TCP协议的Socket通信,包括服务器端与客户端的连接以及客户端之间的连接。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它通过三次...
BoneCP是一款高效、轻量级的Java数据库连接池实现,它的源码分析对于我们理解数据库连接池的工作原理,优化数据库性能以及进行二次开发具有重要意义。 首先,我们需要了解数据库连接池的基本概念。数据库连接池是...
需要注意的是,由于PDA资源有限,通常会采用轻量级的数据库连接池管理策略,以及优化SQL语句和数据传输,以降低功耗和提高性能。 4. **文件www.pudn.com.txt**: 这可能是一个包含资源链接或说明的文本文件,通常...