QuickServer是一个免费的开源Java库,用于快速创建健壮的多线程、多客户端TCP服务器应用程序。使用QuickServer,用户可以只集中处理应用程序的逻辑/协议,从而方便的建立功能强大的服务器应用。该程序由Akshathkumar Shetty设计和实现。
socket编程对程序员来说都不是一件容易的事,创建多线程、多客户端的服务器socket更像一场恶梦了。在每个新的软件中处理多socket连接,我们都要浪费大把时间编写大量重复的代码。QuickServer因而诞生——使用Java创建多线程、多客户端服务器应用。使用QuickServer将减轻程序员编写服务器端多线程操作的负担。下面是QuickServer简单的服务器和客户端的实现。
- Server 服务器端
- EchoCommandHandler 继承 ClientCommandHandler, ClientEventHandler, 实现服务器接收客户端的信息,并回显客户端发来的消息。
package com.easway.quickserver.echo;
import java.io.IOException;
import java.net.SocketTimeoutException;
import org.quickserver.net.server.ClientCommandHandler;
import org.quickserver.net.server.ClientEventHandler;
import org.quickserver.net.server.ClientHandler;
import org.quickserver.net.server.DataMode;
import org.quickserver.net.server.DataType;
/***
* Echo Command Handler
* @author chbai
*
*/
public class EchoCommandHandler implements ClientCommandHandler,
ClientEventHandler {
public void closingConnection(ClientHandler handler) throws IOException {
handler.sendSystemMsg("Closing connection : " + handler.getSocket().getInetAddress() + "! Bye!");
}
public void gotConnected(ClientHandler handler)
throws SocketTimeoutException, IOException {
handler.setDataMode(DataMode.STRING, DataType.IN);
handler.setDataMode(DataMode.STRING, DataType.OUT);
handler.sendClientMsg("+++++++++++++++++++++++++++++++");
handler.sendClientMsg("| Welcome to EchoServer v 1.0 |");
handler.sendClientMsg("| Send 'Quit' to exit |");
handler.sendClientMsg("+++++++++++++++++++++++++++++++");
}
public void lostConnection(ClientHandler handler) throws IOException {
handler.sendSystemMsg("Connection lost: "+ handler.getSocket().getInetAddress()+"! Bye!");
}
public void handleCommand(ClientHandler handler, String command)
throws SocketTimeoutException, IOException {
System.out.println(" command= "+ command);
if(command.equalsIgnoreCase("Quit")){
handler.sendClientMsg("Bye");
handler.closeConnection();
}
else{
handler.sendClientMsg("Server Echo: "+ command);
}
}
}
2. EcoServer 启动QuickServer服务器
package com.easway.quickserver.echo;
import org.quickserver.net.AppException;
import org.quickserver.net.server.QuickServer;
/**
* Quick Sever
* @author chbai
*
*/
public class EchoServer {
/**
* @param args
*/
public static void main(String[] args) {
QuickServer server = new QuickServer("com.easway.quickserver.echo.EchoCommandHandler");
server.setPort(4123);
server.setName("EchoServer v 1.0");
try{
server.startServer();
}catch(AppException e){
System.err.println("Error in server : "+e);
}
}
}
- Client 客户端
package com.easway.quickserver.echo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Quick Server Client
*
* @author chbai
*
*/
public class BussineClient {
private static final Log log = LogFactory.getLog(BussineClient.class);
private Socket socket;
private BufferedReader in;
private int threadNum;
private PrintWriter out;
public BufferedReader getBufferedReader() throws IOException {
Reader inputStream = new InputStreamReader(socket.getInputStream());
return new BufferedReader(inputStream);
}
public PrintWriter getPrintWriter() throws IOException {
OutputStream outputStream = socket.getOutputStream();
return new PrintWriter(outputStream, true);
}
public BussineClient(int num) {
this.threadNum = num;
action();
}
public void action() {
try {
socket = new Socket("localhost", 4123);
in = getBufferedReader();
out = getPrintWriter();
// thread num
out.println("Hello Server");
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}
- Result 结果
客户端向服务器端发送信息Hello Server, 服务器端会将信息回显给客户端。