package org.fanhongtao.middleman.ui; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.fanhongtao.lang.StringUtils; import org.fanhongtao.log.SwtTextAppender; import org.fanhongtao.middleman.core.IMessageWindow; import org.fanhongtao.middleman.server.EchoServer; import org.fanhongtao.middleman.server.MuteServer; import org.fanhongtao.net.frame.MsgInfo; import org.fanhongtao.swt.layout.BorderData; import org.fanhongtao.swt.layout.BorderLayout; import org.fanhongtao.swt.window.ApplicationWindowEx; import org.fanhongtao.utils.Utils; public class MiddleManEx extends ApplicationWindowEx implements IMessageWindow { private Combo comboServer = null; private Text textPort = null; private Button btnStart = null; private TableViewer tv = null; // 显示消息概要信息的表 private Text textLog = null; // 显示运行日志 private ArrayList<MsgInfo> msgList = new ArrayList<MsgInfo>(); // 记录所收到的完整的消息 private MuteServer server = null; private int msgSerial = 0; private long startTime = 0; public MiddleManEx(Shell parentShell) { super(parentShell); } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText("Middle man"); shell.setSize(500, 400); } @Override protected Control createContents(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new BorderLayout()); createConfigure(composite); createContent(composite); return composite; } /** * 创建输入监听端口号的 * @param shell */ private void createConfigure(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(BorderData.NORTH); composite.setLayout(new RowLayout()); new Label(composite, SWT.NONE).setText("服务器类型(&T)"); comboServer = new Combo(composite, SWT.READ_ONLY); comboServer.add("Mute Server"); comboServer.add("Echo Server"); comboServer.setData("Mute Server", "MuteServer"); comboServer.setData("Echo Server", "EchoServer"); comboServer.select(0); new Label(composite, SWT.NONE).setText(" 监听端口(&P)"); textPort = new Text(composite, SWT.NONE); textPort.setText("8088 "); new Label(composite, SWT.NONE).setText(" "); btnStart = new Button(composite, SWT.TOGGLE); btnStart.setText("开始(&S)"); btnStart.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); pushButton(); } }); } private void pushButton() { if (btnStart.getSelection()) { if (!startServer()) { btnStart.setSelection(false); } else { comboServer.setEnabled(false); } } else { stopServer(); comboServer.setEnabled(true); } } private void createContent(Composite parent) { SashForm sashForm = new SashForm(parent, SWT.VERTICAL); sashForm.setLayoutData(BorderData.CENTER); tv = new TableViewer(sashForm, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER); Table table = tv.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); TableLayout layout = new TableLayout(); table.setLayout(layout); for (int i = 0; i < columnName.length; i++) { layout.addColumnData(new ColumnWeightData(columnLen[i])); TableColumn column = new TableColumn(table, SWT.NONE); column.setText(columnName[i]); } tv.setLabelProvider(new MsgLableProvider()); tv.setContentProvider(new MsgContentProvider()); tv.setInput(msgList); addListener(tv); textLog = new Text(sashForm, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); textLog.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { shutDownServer(); } }); SwtTextAppender appender = new SwtTextAppender(textLog); appender.setLayout(new PatternLayout("%r [%t] %-5p %c - %m%n")); Logger.getRootLogger().addAppender(appender); } private boolean startServer() { String serverType = comboServer.getText(); int port = Integer.parseInt(textPort.getText().trim()); if (serverType.equalsIgnoreCase("Echo Server")) { server = new EchoServer(port, this); } else { server = new MuteServer(port, this); } startTime = System.currentTimeMillis(); MsgLableProvider provider = (MsgLableProvider)tv.getLabelProvider(); provider.setStartTime(startTime); boolean ret = server.bind(); if (ret) { new Thread(server).start(); btnStart.setText("停止(&S)"); } return ret; } private void stopServer() { server.setQuit(true); btnStart.setText("开始(&S)"); } private void shutDownServer() { // 终止后台线程运行 if (server != null) { server.setQuit(true); // Server线程select时间为1秒,这里sleep2秒,以便Server有足够的时间退出 Utils.sleep(2000); } } private void addListener(TableViewer tv) { tv.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); MsgInfo msgInfo = (MsgInfo)selection.getFirstElement(); DetailMessageDialog dlg = new DetailMessageDialog(getShell(), msgInfo); dlg.open(); } }); } public void log(String str) { textLog.append(str); textLog.append(StringUtils.CRLF); } private static final String[] columnName = { "序号", "时间", "发送IP", "发送端口", "接收IP", "接入端口", "消息长度", "消息" }; private static final int[] columnLen = { 15, 15, 20, 20, 20, 20, 20, 30 }; public void addMessage(MsgInfo msgInfo) { msgInfo.setTime(System.currentTimeMillis() - startTime); msgInfo.setSerial(++msgSerial); msgList.add(msgInfo); tv.refresh(); } /** * @param args */ public static void main(String[] args) { MiddleManEx app = new MiddleManEx(null); app.initLog("middle_man.properties"); app.run(); } }