import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* socket通信服务器端<br>
* *******************
*
* @author xiaosa
* @copyright (C)2009www.xiaosa.org
* @createTime 2009上午12:11:37
* @version $Id: *
*******************************
*/
public class SocketServer {
private static Log log = LogFactory.getLog(SocketServer.class);
private final int PORT = 9090; // 通信端口
private ServerSocket serverSocket; // socket服务
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 5;// 单个CPU线程池大小
/**
* 构造socket,使用线程池启动服务
*
* @throws IOException
*/
public SocketServer() throws IOException {
serverSocket = new ServerSocket(PORT);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
log.info("服务器启动,使用线程池数量:" + PORT);
}
/**
* 创建socket服务
*/
public void service() {
while (true) {
Socket socket = null;
try {
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
executorService.execute(new SocketHandler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new SocketServer().service();
}
}
/**
* socket服务处理器
*/
class SocketHandler implements Runnable {
private static Log log = LogFactory.getLog(SocketHandler.class);
private Socket socket; // 启动的socket
/**
* 构造socket服务处理器
*
* @param socket
* socket服务
*/
public SocketHandler(Socket socket) {
this.socket = socket;
}
/**
* 获取输出流,即准备向客户端发送数据
*
* @param socket
* socket服务
* @return 输出流
* @throws IOException
* io操作异常
*/
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
/**
* 获取输入流,即接收客户端发送过来的数据
*
* @param socket
* socket服务
* @return 输入流,封装成字节对象
* @throws IOException
* IO操作异常
*/
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
/**
* 输出
*
* @param msg
* 输出内容
* @return 服务器输出
*/
public String echo(String msg) {
return "echo:" + msg;
}
public void run() {
try {
log.info("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* socket通信客户端<br>
* *****************************
*
* @author xiaosa
* @copyright (C)2009www.xiaosa.org
* @createTime 2009上午12:20:56
* @version $Id: *
*******************************
*/
public class SocketClient {
public static void main(String[] args) {
int numTasks = 10;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}
}
// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port = 8821;
public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes());
// 接收服务器的反馈
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}