📄 client.java
字号:
package Howdy;/* This file is part of Howdy. Howdy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Howdy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Foobar; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;import java.text.*;import java.util.*;public class Client extends JFrame implements ActionListener // The graphical client to Howdy.{ int version; // Main stuff. ClientConnectionManager clientConnectionManager; Thread ccmt; // Main panels. JPanel mainP; JPanel northP; JPanel chattersP; JPanel settingsP; JSplitPane sp; JTabbedPane sideTP; // northP stuff. JLabel serverL; JTextField serverTF; JLabel portL; JTextField portTF; JButton connectionB; JButton exitB; // mainP stuff. JTextField inputTF; JTextArea outputTA; JScrollPane outputTASP; JScrollBar outputTASB; // chattersP stuff. JList chattersL; DefaultListModel listModel; DefaultListSelectionModel listSelectionModel; Box chattersSouthBx; JProgressBar lagPB; int lag; Box chattersButtonBx; JButton whisperB; JButton infoB; int[] chattersIndices; // settingsP stuff. Box settingsCenterBx; Box settingsSouthB; Box aliasB; JLabel aliasL; JTextField aliasTF; /*JLabel shoutoutL; JTextArea shoutoutTA;*/ JCheckBox timeCB; JButton applyB; JButton saveB; // Misc. stuff. DateFormat dateFormat; Date date; Random random = new Random(); FileReader settingsReader; FileWriter settingsWriter; String settingsFile; ClientChatter currentChatter; public Client(int version) { this.version = version; // Panels. mainP = new JPanel(); northP = new JPanel(); chattersP = new JPanel(); settingsP = new JPanel(); setContentPane(mainP); mainP.setLayout( new BorderLayout() ); chattersP.setLayout( new BorderLayout() ); // northP stuff. serverL = new JLabel("Server:"); northP.add(serverL); serverTF = new JTextField(15); serverTF.setText("gyzmo.mine.nu"); northP.add(serverTF); portL = new JLabel("Port:"); northP.add(portL); portTF = new JTextField(4); portTF.setText("6989"); northP.add(portTF); connectionB = new JButton("Connect"); connectionB.setActionCommand("Connection"); connectionB.addActionListener(this); northP.add(connectionB); exitB = new JButton("Exit"); exitB.addActionListener(this); northP.add(exitB); mainP.add(northP, BorderLayout.NORTH); // mainP stuff. outputTA = new JTextArea(); outputTA.setEditable(false); outputTA.setLineWrap(true); outputTA.setWrapStyleWord(true); outputTASP = new JScrollPane(outputTA); outputTASB = new JScrollBar(JScrollBar.VERTICAL); outputTASB.setUnitIncrement(30); outputTASB.setBlockIncrement(100); outputTASP.setVerticalScrollBar(outputTASB); inputTF = new JTextField(); inputTF.addActionListener(this); inputTF.setActionCommand("Input"); mainP.add(inputTF, BorderLayout.SOUTH); // chattersP stuff. listModel = new DefaultListModel(); listSelectionModel = new DefaultListSelectionModel(); chattersL = new JList(listModel); chattersL.setSelectionModel(listSelectionModel); chattersP.add(new JScrollPane(chattersL), BorderLayout.CENTER); chattersSouthBx = new Box(BoxLayout.Y_AXIS); chattersP.add(chattersSouthBx, BorderLayout.SOUTH); lagPB = new JProgressBar(0, 1000); lagPB.setStringPainted(true); lagPB.setSize(lagPB.getWidth(), 2); chattersSouthBx.add(lagPB); chattersButtonBx = new Box(BoxLayout.X_AXIS); chattersSouthBx.add(chattersButtonBx); chattersSouthBx.add( Box.createVerticalStrut(5) ); infoB = new JButton("Info"); infoB.addActionListener(this); chattersButtonBx.add(infoB); chattersButtonBx.add( Box.createHorizontalStrut(5) ); whisperB = new JButton("Whisper"); whisperB.addActionListener(this); chattersButtonBx.add(whisperB); // settingsP stuff. settingsCenterBx = new Box(BoxLayout.PAGE_AXIS); settingsSouthB = new Box(BoxLayout.X_AXIS); settingsP.add(new JScrollPane(settingsCenterBx), BorderLayout.CENTER); settingsP.add(settingsSouthB, BorderLayout.SOUTH); aliasB = new Box(BoxLayout.X_AXIS); settingsCenterBx.add(aliasB); aliasL = new JLabel("Alias:"); aliasB.add(aliasL); aliasTF = new JTextField(5); aliasTF.setText( "Anonymous" + random.nextInt(999) ); aliasB.add(aliasTF); /*shoutoutL = new JLabel("Shoutout!"); settingsCenterBx.add(shoutoutL); shoutoutTA = new JTextArea(10, 10); shoutoutTA.setLineWrap(true); shoutoutTA.setWrapStyleWord(true); shoutoutTA.setTabSize(4); settingsCenterBx.add( new JScrollPane(shoutoutTA) );*/ timeCB = new JCheckBox("Show Times"); timeCB.setSelected(true); settingsCenterBx.add(timeCB); applyB = new JButton("Apply"); applyB.setActionCommand("Apply Settings"); applyB.addActionListener(this); settingsSouthB.add(applyB); settingsSouthB.add( Box.createHorizontalStrut(5) ); saveB = new JButton("Save"); saveB.setActionCommand("Save Settings"); saveB.addActionListener(this); settingsSouthB.add(saveB); // Window stuff. sideTP = new JTabbedPane(); sideTP.add("Chatters", chattersP); sideTP.add("Settings", settingsP); sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, outputTASP, sideTP); mainP.add(sp, BorderLayout.CENTER); //setTitle("Howdy[Client] v" + version); setSize(800, 350); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); sp.setDividerLocation(getWidth() - 175); setDefaultWindow(); setVisible(true); // Other stuff. clientConnectionManager = new ClientConnectionManager(this); dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); settingsFile = System.getProperty("user.home") + "/.HowdyClientSettings"; readSettings(); } public void actionPerformed(ActionEvent ae) { if( ae.getActionCommand().equals("Input") ) { if( inputTF.getText().equals("") ) Toolkit.getDefaultToolkit().beep(); else { clientConnectionManager.sendMessage( inputTF.getText() ); inputTF.setText(""); } } else if( ae.getActionCommand().equals("Connection") ) connectBmanager(false); // Makes the program look at the button text, so the parameter doesn't matter. else if( ae.getActionCommand().equals("Whisper") ) whisperBManager(); else if( ae.getActionCommand().equals("Info") ) infoBManager(); else if( ae.getActionCommand().equals("Apply Settings") ) applySettings(); else if( ae.getActionCommand().equals("Save Settings") ) writeSettings(); else if( ae.getActionCommand().equals("Exit") ) { setDefaultWindow(); System.exit(0); } } void appendOutput(String input) // Prints messages to the screen. { if(timeCB.isSelected() == true) outputTA.append( dateFormat.format( new Date() ) + ": " + input + "\n"); else if(timeCB.isSelected() == false) outputTA.append(input + "\n"); outputTASB.setValue( outputTASB.getMaximum() ); Toolkit.getDefaultToolkit().beep(); } void connectBmanager(boolean connect) // Runs stuff when connectB is pressed. { if(connected() == false || connect == true) { if(aliasTF.getText().length() > 20 || aliasTF.getText().length() < 1) warningPopup("Your alias is either too short or too long.", "Connection Error"); else if(clientConnectionManager.connection(true) == true) { outputTA.setText(""); listModel.clear(); ccmt = new Thread(clientConnectionManager); ccmt.start(); chattersL.setEnabled(true); inputTF.setEnabled(true); whisperB.setEnabled(true); infoB.setEnabled(true); serverTF.setEnabled(false); portTF.setEnabled(false); setTitle(serverTF.getText() + " - Howdy[Client] v" + version); connectionB.setText("Disconnect"); } } else if( connected() == true || connect == false) { if(clientConnectionManager.connection(false) == true) setDefaultWindow(); } } boolean connected() { if( connectionB.getText().equals("Connect") ) return false; else return true; } void warningPopup(String message, String title) { JOptionPane.showMessageDialog(this, message, title, JOptionPane.WARNING_MESSAGE); } void errorPopup(String message, String title) { JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE); } int getPort() // Returns an integer of the number in portTF. { try { return Integer.parseInt( portTF.getText() ); } catch(NumberFormatException nfe) { warningPopup("A port has to be an integer!", "Connection Error"); return -1; } } void setDefaultWindow() // Set everything to be proper before connecting. { try { if(ccmt != null) { clientConnectionManager.socket.close(); clientConnectionManager.cpt = null; ccmt = null; } inputTF.setEnabled(false); whisperB.setEnabled(false); infoB.setEnabled(false); inputTF.setText(""); serverTF.setEnabled(true); portTF.setEnabled(true); setTitle("Howdy[Client] v" + version); connectionB.setText("Connect"); chattersL.setEnabled(false); lagPB.setValue(0); lagPB.setString("Responsiveness"); } catch(Exception e) {e.printStackTrace();} } void updateChattersList(Vector chatters) // Thows data at chattersL. { listModel.clear(); for(int i = 0; i < chatters.size(); i++) { currentChatter = (ClientChatter)chatters.elementAt(i); listModel.addElement(currentChatter.alias); } } void whisperBManager() // Does stuff when whisperB is pressed. { chattersIndices = chattersL.getSelectedIndices(); if( inputTF.getText().equals("") ) Toolkit.getDefaultToolkit().beep(); else { for(int i = 0; i < chattersIndices.length; i++) clientConnectionManager.sendWhisper( (String) chattersL.getModel().getElementAt(chattersIndices[i]), inputTF.getText() ); if(chattersIndices.length > 0) inputTF.setText(""); } } void infoBManager() { chattersIndices = chattersL.getSelectedIndices(); for(int i = 0; i < chattersIndices.length; i++) { for(int j = 0; j < clientConnectionManager.chatters.size(); j++) { currentChatter = (ClientChatter)clientConnectionManager.chatters.elementAt(j); if( currentChatter.alias.equals( chattersL.getModel().getElementAt(chattersIndices[i]) ) ) clientConnectionManager.getInfo(currentChatter.alias); } } } void popupInfoBox() { currentChatter = clientConnectionManager.currentChatter3; JOptionPane.showMessageDialog(this, "Alias: " + currentChatter.alias + "\nIP: " + currentChatter.IP + "\nConnected for " + currentChatter.timeConnected + "\nResponse Time: " + currentChatter.lag + "ms", "Information About User " + currentChatter.alias, JOptionPane.INFORMATION_MESSAGE); } void applySettings() { if(connected() == true) { clientConnectionManager.setAlias(false); } // ADD STUFF HERE } void writeSettings() { applySettings(); try { settingsWriter = new FileWriter(settingsFile); settingsWriter.write("alias=" + aliasTF.getText() + "\n"); settingsWriter.write("times=" + timeCB.isSelected() + "\n"); settingsWriter.close(); } catch(IOException ioe) { errorPopup("I couldn't open the settings file to write it!", "File Error"); } } void readSettings() { try { settingsReader = new FileReader(settingsFile); BufferedReader fileReader = new BufferedReader(settingsReader); String line; while( ( line = fileReader.readLine() ) != null) { if( line.startsWith("alias=") ) aliasTF.setText( line.substring(6) ); else if ( line.startsWith("times=") ) { if( line.substring(6).equals("true") ) timeCB.setSelected(true); else if( line.substring(6).equals("false") ) timeCB.setSelected(false); } } applySettings(); settingsReader.close(); } catch(IOException ioe) { System.out.println("Could not open settings file to load settings!"); } } String getTimeLoggedIn(long loginTime) { date = new Date(); long timeLoggedIn = date.getTime() - loginTime; long seconds = timeLoggedIn / 1000; long minutes = seconds / 60; long hours = minutes / 60; long mmod = minutes % 60; return hours + "h" + mmod + "m"; } void processPong(ClientPinger clientPinger) { date = new Date(); long millis = date.getTime() - clientPinger.lastPing; long longlag = 1000 - millis; String stringlag = Long.toString(longlag); lag = Integer.parseInt(stringlag); lagPB.setValue(lag); lagPB.setString("Response: " + millis + "ms"); } void checkVersion(String serverVersionS) { int serverVersion = 0; try { serverVersion = Integer.parseInt(serverVersionS); } catch(NumberFormatException nfe) { warningPopup("I was not able to parse the server's version. The server might not be functioning properly.", "Version Parse Error"); } if(serverVersion != version) warningPopup("You have connected to a version " + serverVersion + " server using a version " + version + " client.\n" + "It is HIGHLY reccomended that you disconnect and aquire a version " + serverVersion + " client to connect to this server.", "Versioning Difference"); }}// Copyright (C) 2003-2004 Serban Giuroiu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -