在参与项目的过程中,遇到系统通信场景。系统原先使用基于netty框架,pl觉得过于复杂,于是他自己开发了一个简单的通信模块。
交互过程如下图:
1.Client端代码
public class Client {
private Client client;
private Client() {
}
public Client getInstance() {
if (null == client) {
synchronized (Client.class) {
if (null == client) {
client = new Client();
}
}
}
return client;
}
public Response sendMessage(String host,Request request){
MessageSender sender = new MessageSender(host,request);
sender.run();
return sender.getResponse();
}
}
2.messageSender代码
public class MessageSender {
private String host;
private Request request;
private Response response;
public MessageSender(String host, Request request) {
this.host = host;
this.request = request;
this.response = new Response();
}
public void run() {
Socket socket = null;
ObjectOutputStream oout = null;
ObjectInputStream oin = null;
try {
socket = new Socket(host, SocketConstant.SERVERPORT);
oout = new ObjectOutputStream(socket.getOutputStream());
oin = new ObjectInputStream(socket.getInputStream());
oout.writeObject(request);
response = (Response) oin.readObject();
} catch (Exception e) {
} finally {
SocketUtil.close(oout, oin, socket);
}
}
public Response getResponse(){
return this.response;
}
}
3.server端代码
public abstract class Server {
protected ExecutorService threadPool;
private MessageHandler messageHandler;
public Server() {
}
public abstract void init();
protected void startServer() {
Runnable acceptThread = new Runnable() {
@Override
public void run() {
try {
ServerSocket ss = new ServerSocket(
SocketConstant.SERVERPORT);
while (true) {
Socket socket = ss.accept();
threadPool.execute(new ServerThread(socket,
messageHandler));
}
} catch (Exception e) {
}
}
};
Thread thread = new Thread(acceptThread);
thread.start();
}
public void setThreadPool(ExecutorService threadPool) {
this.threadPool = threadPool;
}
public void setMessageHandler(MessageHandler messageHandler) {
this.messageHandler = messageHandler;
}
}
4.server端task实现abstract Server的子类
public class TaskServer extends Server {
@Override
public void init() {
super.threadPool = Executors.newFixedThreadPool(SocketConstant.THREADPOOLSIZE);
super.startServer();
}
}
5.messageHandler处理类,接口,具体的业务实现自己的类
public interface MessageHandler {
public Response process(Request request);
}
6.以serverThread类,该类作用是处理服务端accept的socket
public class ServerThread implements Runnable{
private Socket socket;
private MessageHandler messageHandler;
public ServerThread(Socket socket,MessageHandler messageHandler){
this.socket= socket;
this.messageHandler=messageHandler;
}
@Override
public void run() {
ObjectOutputStream oout=null;
ObjectInputStream oin=null;
try{
oin = new ObjectInputStream(socket.getInputStream());
oout=new ObjectOutputStream(socket.getOutputStream());
Request request=(Request)oin.readObject();
Response response=messageHandler.process(request);
oout.writeObject(response);
}catch(Exception e){
processException(oout,e);
}finally{
SocketUtil.close(oout, oin, socket);
}
}
private void processException(ObjectOutputStream oout,Exception e){
if(null != oout){
try{
Response response = new Response();
response.setErrorMsg(e.getMessage());
oout.writeObject(response);
}catch(Exception exception){
}
}
}
}