package org.fanhongtao.middleman.server; import java.io.IOException; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import java.util.HashMap; import org.apache.log4j.Logger; import org.fanhongtao.middleman.core.IMessageWindow; public class ExchangeServer extends MuteServer { private static Logger logger = Logger.getLogger(ExchangeServer.class); private String destIP; private int destPort; private HashMap<SocketChannel, SocketChannel> exchangeMap = new HashMap<SocketChannel, SocketChannel>(); public ExchangeServer(int port, IMessageWindow logWindow) { super(port, logWindow); destIP = "localhost"; destPort = 8080; } @Override protected void onAccept(SocketChannel client) { } /** * 处理来自客户端的消息 * * @param key 代表对应的客户端 * */ public void receiveDataFromClient(SelectionKey key) { // 由key获取指定socketchannel的引用 SocketChannel clientChannel = (SocketChannel) key.channel(); readBuffer.clear(); try { // 读取数据到readBuffer while (clientChannel.read(readBuffer) > 0) { ; // do nothing } // 确保 readBuffer 可读 readBuffer.flip(); // 读入字节为0, 则认为是客户端已经断连 if (readBuffer.limit() == 0) { throw new IOException("Read 0 bytes from socket."); } // 将接收到的消息记录下来 logReceivedMessage(clientChannel); // 将 readBuffer 内容拷入 writeBuffer writeBuffer.clear(); writeBuffer.put(readBuffer); writeBuffer.flip(); // 记录下发送给客户端的消息 logWritedMessage(clientChannel); // 将数据返回给客户端 while (writeBuffer.hasRemaining()) { clientChannel.write(writeBuffer); } } catch (IOException e) { e.printStackTrace(); logger.info("close a client , port is " + clientChannel.socket().getPort()); key.cancel(); try { key.channel().close(); } catch (IOException e1) { e1.printStackTrace(); } } } }