⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 Howdy Communication System的目的是提供一个简单、易用的基于文本的 TCP/IP 通信方法
💻 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 + -