📄 clientinitiategui.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 + -