mirror of
https://github.com/Estom/notes.git
synced 2026-02-04 19:13:24 +08:00
Java内容重新整理删除过期的东西
This commit is contained in:
53
Java/JavaDemo/codedemo/io/MultiThreadEchoServer.java
Normal file
53
Java/JavaDemo/codedemo/io/MultiThreadEchoServer.java
Normal file
@@ -0,0 +1,53 @@
|
||||
package cn.aofeng.demo.io;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 多线程网络echo服务。每接收到一个新连接都新建一个线程处理,连接关闭后线程随之销毁。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">NieYong</a>
|
||||
*/
|
||||
public class MultiThreadEchoServer {
|
||||
|
||||
private final static Logger logger = Logger.getLogger(MultiThreadEchoServer.class.getName());
|
||||
|
||||
/**
|
||||
* @param args [0]-监听端口
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
if (args.length != 1) {
|
||||
System.err.println("无效的参数。使用示例:");
|
||||
System.err.println(" java cn.aofeng.demo.io.MultiThreadEchoServer 9090");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
int port = Integer.parseInt(args[0]);
|
||||
ServerSocket serverSocket = null;
|
||||
try {
|
||||
serverSocket = new ServerSocket();
|
||||
serverSocket.bind(new InetSocketAddress(port));
|
||||
if (logger.isLoggable(Level.INFO)) {
|
||||
logger.info("多线程网络echo服务启动完毕,监听端口:" +port);
|
||||
}
|
||||
while (true) {
|
||||
// 接收新的客户端连接
|
||||
Socket socket = serverSocket.accept();
|
||||
if (logger.isLoggable(Level.INFO)) {
|
||||
logger.info("收到一个新的连接,客户端IP:"+socket.getInetAddress().getHostAddress()+",客户端Port:"+socket.getPort());
|
||||
}
|
||||
|
||||
// 新建一个线程处理Socket连接
|
||||
Thread thread = new Thread(new Worker(socket));
|
||||
thread.start();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "处理网络连接出错", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
55
Java/JavaDemo/codedemo/io/ThreadPoolEchoServer.java
Normal file
55
Java/JavaDemo/codedemo/io/ThreadPoolEchoServer.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package cn.aofeng.demo.io;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 线程池网络echo服务。每接收到一个新连接都由线程池中的空闲线程处理,连接关闭后释放线程(不会销毁线程,仍在线程池中)。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">NieYong</a>
|
||||
*/
|
||||
public class ThreadPoolEchoServer {
|
||||
|
||||
private final static Logger logger = Logger.getLogger(MultiThreadEchoServer.class.getName());
|
||||
|
||||
/**
|
||||
* @param args [0]-监听端口
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
if (args.length != 1) {
|
||||
System.err.println("无效的参数。使用示例:");
|
||||
System.err.println(" java cn.aofeng.demo.io.ThreadPoolEchoServer 9090");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
int port = Integer.parseInt(args[0]);
|
||||
ExecutorService threadpool = Executors.newFixedThreadPool(5);
|
||||
ServerSocket serverSocket = null;
|
||||
try {
|
||||
serverSocket = new ServerSocket();
|
||||
serverSocket.bind(new InetSocketAddress(port));
|
||||
if (logger.isLoggable(Level.INFO)) {
|
||||
logger.info("线程池网络echo服务启动完毕,监听端口:" +port);
|
||||
}
|
||||
while (true) {
|
||||
// 接收新的客户端连接
|
||||
Socket socket = serverSocket.accept();
|
||||
if (logger.isLoggable(Level.INFO)) {
|
||||
logger.info("收到一个新的连接,客户端IP:"+socket.getInetAddress().getHostAddress()+",客户端Port:"+socket.getPort());
|
||||
}
|
||||
|
||||
// 将Socket连接交给线程池处理
|
||||
threadpool.submit(new Worker(socket));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "处理网络连接出错", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
77
Java/JavaDemo/codedemo/io/Worker.java
Normal file
77
Java/JavaDemo/codedemo/io/Worker.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package cn.aofeng.demo.io;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 处理客户端Socket连接的工作线程。
|
||||
*
|
||||
* @author 聂勇 <a href="mailto:aofengblog@163.com">aofengblog@163.com</a>
|
||||
*/
|
||||
public class Worker implements Runnable {
|
||||
|
||||
private final static Logger logger = Logger.getLogger(MultiThreadEchoServer.class.getName());
|
||||
|
||||
// 字符集编码
|
||||
private final static String CHAR_SET = "utf8";
|
||||
|
||||
// 行结束符
|
||||
private final static String CRLF = "\r\n";
|
||||
|
||||
private Socket socket = null;
|
||||
|
||||
public Worker(Socket socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
public void setSocket(Socket socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
public void close(Closeable c) {
|
||||
if (null != c) {
|
||||
try {
|
||||
c.close();
|
||||
} catch (IOException e) {
|
||||
// ingore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (null == socket || socket.isClosed()) {
|
||||
logger.warning("无效的Socket连接:" + socket);
|
||||
return;
|
||||
}
|
||||
|
||||
String lineEnd = CRLF;
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
socket.getInputStream()));
|
||||
OutputStream outs = socket.getOutputStream();
|
||||
String line = null;
|
||||
while ( null != (line = reader.readLine()) ) {
|
||||
// 客户端退出
|
||||
if ("quit".equalsIgnoreCase(line) || "exit".equalsIgnoreCase(line)) {
|
||||
break;
|
||||
}
|
||||
|
||||
outs.write(line.getBytes(CHAR_SET));
|
||||
outs.write(lineEnd.getBytes(CHAR_SET));
|
||||
}
|
||||
close(reader);
|
||||
close(outs);
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "读取网络连接数据出错", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user