服务器程序EchoServer.java;
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class EchoServer {
private int port=10000;
private ServerSocket serverSocket;
private ExecutorService executor;//线程池
private final int pool_size=4;
private int portForShutdown=10001;
private ServerSocket serverSocketForShutdown=null;
private boolean isShutdown=false;
private Thread shutdownThread=new Thread() //负责关闭服务器的线程
{
public void start()
{
this.setDaemon(true); //设为守护线程
super.start();
}
public void run()
{
while(!isShutdown)
{
Socket socketForShutdown=null;
try{
socketForShutdown=serverSocketForShutdown.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(socketForShutdown.getInputStream()));
String command=br.readLine();
if(command.equals("shutdown"))
{
long beginTime=System.currentTimeMillis();
socketForShutdown.getOutputStream().write("服务器正在关闭\r\n".getBytes());
isShutdown=true;
executor.shutdown();
while(!executor.isTerminated())
{
executor.awaitTermination(30, TimeUnit.SECONDS);
}
serverSocket.close();
long endTime=System.currentTimeMillis();
socketForShutdown.getOutputStream().write(("服务器已经关闭,耗时"+(beginTime-endTime)+"毫秒\r\n").getBytes());
socketForShutdown.close();
}else
{
socketForShutdown.getOutputStream().write("错误的命令\r\n".getBytes());
//socketForShutdown.close();
}
}catch(IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
public EchoServer() throws IOException{
serverSocket=new ServerSocket(port);
serverSocket.setSoTimeout(60000);
serverSocketForShutdown=new ServerSocket(portForShutdown);
shutdownThread.start();
System.out.println("server started...");
}
public void service(){
while(!isShutdown){
Socket socket=null;
try {
socket=serverSocket.accept();
executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*pool_size);
executor.execute(new Handler(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
try {
new EchoServer().service();
} catch (IOException e) {
e.printStackTrace();
}
}
}
***********************************************************************************
客户端程序EchoClient.java:
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoClient {
private String host="localhost";
private int port=10000;
Socket socket=null;
public EchoClient() throws IOException{
socket=new Socket(host,port);
}
public static void main(String args[]){
try {
new EchoClient().talk();
} catch (IOException e) {
e.printStackTrace();
}
}
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 void talk(){
try{
BufferedReader br=this.getReader(socket);
PrintWriter pw=this.getWriter(socket);
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
String msg=null;
while((msg=localReader.readLine())!=null){
pw.println(msg);
System.out.println(br.readLine());
if(msg.equalsIgnoreCase("bye"))
break;
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
*****************************************************************************************************************
Handler.java
import java.net.*;
import java.io.*;
public class Handler implements Runnable {
private Socket socket=null;
public Handler(Socket socket)
{
this.socket=socket;
}
public void run() {
try{
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=this.getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null)
{
System.out.println("server received: "+msg);
pw.println(echo(msg));
if(msg.equalsIgnoreCase("bye"))
break;
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(socket!=null)socket.close();
System.out.println("connection close..");
}
catch(IOException e){
e.printStackTrace();
}
}
}
public String echo(String msg){
return "echo:--->"+msg;
}
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));
}
}
******************************************************************************************************************
import java.net.*;
import java.io.*;
public class AdminClient {
public static void main(String args[])
{
Socket socket=null;
int port=10001;
try {
socket =new Socket("localhost",port);
OutputStream out=socket.getOutputStream();
out.write("shutdown\r\n".getBytes());
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg=br.readLine();
System.out.println(msg);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}