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

📄 clientinitiategui.java

📁 JAVA实现的聊天工具,可以容纳最多10个用户 1.本系统需要JDK1.5 或更高版本的支持。 2.serverDatabase为服务器端的数据文件. 若使用现有数据,可用帐号:1, 密码
💻 JAVA
字号:
//thread to log in or register
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientInitiateGUI implements Runnable,ActionListener{
	private JFrame frame,registerFrame;
	private JTextField serverField,nameField,mailField,fromField;
	private JPasswordField pwLogField,pwReField1,pwReField2;
	private JFormattedTextField ageField,idLogField;
	private JComboBox cb;
	
	private long currentClientID;
	private String serverAddress;
	private final static String EXIT="exit";
	private final static String LOGIN="login";
	private final static String REGISTERNOW="registernow";
	private final static String REEXIT="reexit";
	private final static String REREGISTER="reregister";
	private boolean connecting=false;
	private Socket serverSocket; //use port 4444
	private ObjectOutputStream oosServer; //stream to communicate with server
    private ObjectInputStream oisServer;
    private DataOutputStream dos;
	private DataInputStream dis;
	private ByteArrayInputStream bais;
	private ByteArrayOutputStream baos;
	private byte[] byteArray;
    private Thread threadPoolBuilder;
	
	public void run(){
		frame=new JFrame("Welcome to Chat-Client System!");
		frame.setDefaultLookAndFeelDecorated(true);
		frame.setContentPane(makeMainPane());
		frame.setResizable(false);
		frame.pack();
		frame.setSize(frame.getPreferredSize().width,frame.getPreferredSize().height);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent ae){
		String type=ae.getActionCommand();
		if(type.equals(LOGIN)){
			
			if(connecting){
				JOptionPane.showMessageDialog(frame,"Connectting!","Warning",JOptionPane.WARNING_MESSAGE);
				return;
			}
			connecting=true;
			serverAddress=serverField.getText(); //get server address
			if(!initiateSocketStreams(serverAddress)){ //connection failed
				connecting=false;
				return;
			}
			//connection has been built
			currentClientID=Long.parseLong(idLogField.getText());
			String pw=new String(pwLogField.getPassword());
			//send online request to server
			ServerClientData in=null;
			ServerClient sc=new ServerClientData("online",currentClientID,pw);
			try{//send online info
				oosServer.flush();
				oosServer.writeObject(sc);
				oosServer.flush();
				byteArray=baos.toByteArray();
				dos.write(byteArray,0,byteArray.length);
				//for(int j=0;j<100000000;j++);  //**test
				//receive confirm data
				byteArray=new byte[6000];
				dis.read(byteArray,0,6000);
				bais=new ByteArrayInputStream(byteArray);
				oisServer=new ObjectInputStream(bais);
				in=(ServerClientData)oisServer.readObject();
			}catch(IOException e){
				System.out.println(e+" ClientControlThread "+e.getMessage());
			}catch(ClassNotFoundException e){
				System.out.println(e+" ClientControlThread "+e.getMessage());
			}
			
			String ok=in.getType();
			String tf=in.getTF();
			if(ok.equals("confirmOnline")) //receive server online-confirm
				if(tf.equals("true")){					
					//System.out.println("Connection has been built!");
					/*JOptionPane.showMessageDialog(frame,"Have connected to server!",
							"Log-In successful",JOptionPane.INFORMATION_MESSAGE);*/
					//setup thread pool to listen on port 4445
					threadPoolBuilder=new Thread(new ClientThreadPoolBuilder(currentClientID,serverAddress),
							"ClientThreadBuilder");
					threadPoolBuilder.start();
					frame.dispose();
				}								
				else{
					connecting=false;
					JOptionPane.showMessageDialog(frame,in.getInfo(),
							"Log-in failed",JOptionPane.INFORMATION_MESSAGE);
					//System.out.println("Connection failed:"+in.getInfo());
				}	
			
			closeSocketStreams();
			
		}
		else if(type.equals(REGISTERNOW)){ //to start register frame
			serverAddress=serverField.getText(); //get server address
			
			frame.setVisible(false);  //to hide main frame
			registerFrame=new JFrame("Register");
			registerFrame.setContentPane(makeRegisterPane());
			registerFrame.setResizable(false);
			registerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			registerFrame.pack();
			registerFrame.setLocationRelativeTo(null);
			registerFrame.setVisible(true);
		}
		else if(type.equals(EXIT)){ //main pane exit
			frame.dispose();
			System.exit(1);
		}
		
		else if(type.equals(REREGISTER)){  //send register info to server
			
			if(connecting){
				JOptionPane.showMessageDialog(frame,"Connectting!","Warning",JOptionPane.WARNING_MESSAGE);
				return;
			}
			connecting=true;
			serverAddress=serverField.getText(); //get server address
			if(!initiateSocketStreams(serverAddress)){ //connection failed
				connecting=false;
				return;
			}
			
			String name=nameField.getText();
			String pw1=new String(pwReField1.getPassword()), pw2=new String(pwReField2.getPassword());
			String age=ageField.getText();
			String sex=(String)cb.getSelectedItem();
			String mail=mailField.getText();
			String from=fromField.getText();
			
			if(!pw1.equals(pw2)){
				JOptionPane.showMessageDialog(registerFrame,"Two passwords aren't equal!",
						"Error",JOptionPane.ERROR_MESSAGE);
				connecting=false;
				return;
			}
			
			ServerClientData d=new ServerClientData("register",name,pw1,age,sex,mail,from); //register info
			ServerClientData in=null;
			try{//send object to server
				oosServer.flush();
				oosServer.writeObject(d);
				oosServer.flush();
				byteArray=baos.toByteArray();
				dos.write(byteArray,0,byteArray.length);
				//for(int j=0;j<100000000;j++);  //**test
				byteArray=new byte[6000];
				dis.read(byteArray,0,6000);
				bais=new ByteArrayInputStream(byteArray);
				oisServer=new ObjectInputStream(bais);
				in=(ServerClientData)oisServer.readObject(); //read cinfirm info
			}catch(IOException e){
				System.out.println(e+" ClientControlThread "+e.getMessage());
			}catch(ClassNotFoundException e){
				System.out.println(e+" ClientControlThread "+e.getMessage());
			}
			
			if(in.getType().equals("registerConfirm")){				
				if(in.getTF().equals("true"))
					JOptionPane.showMessageDialog(registerFrame,"Successfully registered,your ID:"+in.getID(),
							"Register successful",JOptionPane.INFORMATION_MESSAGE);
				registerFrame.dispose();
				frame.setVisible(true);
				connecting=false;
			}
			
			closeSocketStreams();
		}
		
		else{  //exit register pane
			registerFrame.dispose();
			frame.setVisible(true);
		}
	}
	
	private Container makeRegisterPane(){
		Container original=new JPanel();
		original.setLayout(new BoxLayout(original,BoxLayout.Y_AXIS));
		JPanel pane=new JPanel(new GridLayout(1,2));
		
		JLabel label=new JLabel("* Input name:");
		//JTextField field=new JTextField();
		nameField=new JTextField();
		pane.add(label);
		pane.add(nameField);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("* Input password:");
		pwReField1=new JPasswordField();
		pwReField1.setEchoChar('●');
		pane.add(label);
		pane.add(pwReField1);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("* Input password again:");
		pwReField2=new JPasswordField();
		pwReField2.setEchoChar('●');
		pane.add(label);
		pane.add(pwReField2);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("Input E-mail:");
		mailField=new JTextField();
		pane.add(label);
		pane.add(mailField);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("Input age:");
		ageField=new JFormattedTextField();
		ageField.setValue(new Integer(0));
		pane.add(label);
		pane.add(ageField);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("Select sex:");
		cb=new JComboBox();
		cb.insertItemAt("",0);
		cb.insertItemAt("Male",1);
		cb.insertItemAt("Female",2);
		pane.add(label);
		pane.add(cb);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		label=new JLabel("Input From:");
		fromField=new JTextField();
		pane.add(label);
		pane.add(fromField);
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		
		pane=new JPanel(new GridLayout(1,2));
		JButton button=new JButton("Register");
		button.setActionCommand(REREGISTER);
		button.addActionListener(this);
		button.setToolTipText("To register and obtain a new new ID.");
		pane.add(button);
		button=new JButton("Exit");
		button.setActionCommand(REEXIT);
		button.addActionListener(this);
		pane.add(button);
		original.add(pane);
		
		return original;
	}
	
	private Container makeMainPane(){
		Container original=new JPanel();
		original.setLayout(new BoxLayout(original,BoxLayout.Y_AXIS));
		
		JPanel pane=new JPanel(new GridLayout(3,2));
		JLabel idLabel=new JLabel("    Please input your ID:");
		JLabel pwLabel=new JLabel("    Please input your password:");
		JLabel serverAddressLabel=new JLabel("    Input server's address:");
		serverAddressLabel.setToolTipText("To input the server's name or its IP address.");
		serverField=new JTextField();
		idLogField=new JFormattedTextField();
		idLogField.setValue(new Integer(1));
		pwLogField=new JPasswordField();
		pwLogField.setEchoChar('●');
		pwLogField.setActionCommand(LOGIN);
		pwLogField.addActionListener(this);
		pane.add(serverAddressLabel);
		pane.add(serverField);
		pane.add(idLabel);
		pane.add(idLogField);
		pane.add(pwLabel);
		pane.add(pwLogField);		
		
		JPanel buttonPane=new JPanel();
		buttonPane.setLayout(new GridLayout(1,3));
		JButton button=new JButton("Log In");
		button.setActionCommand(LOGIN);
		button.addActionListener(this);
		button.setToolTipText("To connect to the server");
		buttonPane.add(button);
		//button.add(Box.createHorizontalStrut(5));
		button=new JButton("Register");
		button.setActionCommand(REGISTERNOW);
		button.addActionListener(this);
		button.setToolTipText("To register and obtain a new new ID.");
		buttonPane.add(button);
		//button.add(Box.createHorizontalStrut(5));
		button=new JButton("Exit");
		button.setActionCommand(EXIT);
		button.addActionListener(this);
		buttonPane.add(button);
		
		original.add(pane);
		original.add(Box.createVerticalStrut(5));
		original.add(buttonPane);
		return original;
	}
	
	private boolean initiateSocketStreams(String serverAddress){ 
		try{
			serverSocket=new Socket(serverAddress, 4444);  //construct connection to server
		
			baos=new ByteArrayOutputStream(6000);
			oosServer=new ObjectOutputStream(baos);
			dos=new DataOutputStream(serverSocket.getOutputStream());
			dis=new DataInputStream(serverSocket.getInputStream());
		}catch(ConnectException e){
			JOptionPane.showMessageDialog(frame,"Server hasn't been set up!",
					"Connection Failed",JOptionPane.INFORMATION_MESSAGE);
			//System.out.println("Server hasn't been set up!");
			return false;
		}
		catch(UnknownHostException e){
			JOptionPane.showMessageDialog(frame,"Cannot connect to server:"+serverAddress,
					"Connection Failed",JOptionPane.INFORMATION_MESSAGE);
			//System.out.println(e+" ClientControlThread "+e.getMessage());
			return false;
		}catch(IOException e){
			JOptionPane.showMessageDialog(frame,"IOException cause connection failed!",
					"Connection Failed",JOptionPane.INFORMATION_MESSAGE);
			//System.out.println(e+" ClientControlThread "+e.getMessage());
			return false;
		}
		return true;
		
	}
	
	private void closeSocketStreams(){
		try{
			serverSocket.close();
			baos.close();
			bais.close();
			oosServer.close();
			oisServer.close();
			dos.close();
			dis.close();
		}catch(IOException e){
			System.out.println(e+" ClientControlThread "+e.getMessage());
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -