线程池在socket通信中的应用
来源:互联网 发布:电商平台数据库设计 编辑:程序博客网 时间:2024/05/20 03:05
package com.socket.complex;
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.*;
import java.util.concurrent.*;
public class MultiThreadServer {
private int port = 8821;
private ServerSocket serverSocket;
private ExecutorService executorService;// 线程池
private final int POOL_SIZE = 10;// 单个CPU线程池大小
public MultiThreadServer() throws IOException {
serverSocket = new ServerSocket(port);
// Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("服务器启动");
}
public void service() {
while (true) {
Socket socket = null;
try {
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
***********************************************处理类部分************************************************************
package com.socket.complex;
import java.io.*;
import java.net.*;
/**
*
*/
public class Handler implements Runnable {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg) {
return "echo:" + msg;
}
public void run() {
try {
System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
pw.println("Welcome client:"+socket.getPort());//pw希望能和客户端交互
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println("Server get messgae:"+msg);//pw希望能和客户端交互
pw.println(echo(msg));
if (msg.equals("shutdown")){
System.out.println("Connection disconnect " + socket.getInetAddress() + ":" + socket.getPort());
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
***********************************************客户端部分*********************************************************
package com.socket.complex;
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;
/**
*
*/
public class MultiThreadClient {
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();
}
}
};
}
}
- 线程池在socket通信中的应用
- select 在socket通信中的应用
- FMS 中xml socket通信在main.asc中的应用
- 多线程在Android中的应用以及线程间的通信
- socket通信中的select应用简要说明
- Socket在局域网通信中应用
- Socket在Android中的应用
- Socket在Android中的应用
- select在socket中的应用
- socket在ios中的应用
- Android在Socket通信中的辅助类
- performSelector 在线程中的应用
- socket,线程池(TCP通信)
- 单线程socket通信
- Select在Socket编程中的应用
- JAVANIO在Socket 通讯中的应用(转)
- Select在Socket编程中的应用
- web socket在PHP中的应用
- Android 在一个程序中启动另一个程序
- java 与 c++ 、 C# 之间的区别与联系
- 第三章 系统运作机制
- Android UI学习 - Menu菜单
- Spring MVC RestFul 中的 DELETE 传输方式
- 线程池在socket通信中的应用
- Requires VIBRATE permission
- Using openCV for Mac OS in XCode
- Windows Mobile程序全屏与非全屏
- Android 获取系统或SDCARD剩余空间信息
- magent编译出错
- css解决td单元格内文字溢出
- Out-of-order execution
- Yahoo Web UIs-Java开发者丰富的Web UI