问题:使用客户端直接运行可以完成客户端和服务器端的信息发送和接受。
但是使用登录界面通过密码验证后创建客户端会导致客户端窗口出现后,但是其内部的组件不显示,直到关闭服务端后重写出现。
//代码部分:
服务端:
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyServer extends JFrame {
private ServerSocket server;
private Socket socket;
BufferedReader reader;
private JTextArea ta= new JTextArea();//多行输入
private JTextField tf =new JTextField();//单行输入
Container cc;
private PrintWriter writer;
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
public MyServer(){
setTitle("Send message to Client");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc=this.getContentPane();
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane, BorderLayout.CENTER);
scrollPane.setViewportView(ta);
cc.add(tf,"South");
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//绑定事件
writer.println(tf.getText());
ta.append("Server: "+sd.format(new Date())+"\n");
ta.append(tf.getText()+'\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText("");
}
});
setResizable(false);
}
public void getServer(){
try {
server = new ServerSocket(2190);
ta.append("Server is successfully running!\n");
while(true){
ta.append("waiting for Client!\n");
socket = server.accept();
ta.append("Client: "+socket.getInetAddress()+" is connected!\n");
writer = new PrintWriter(socket.getOutputStream(),true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getClientMessage();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void getClientMessage() {
try{
while(true) {
ta.append("Client:" +sd.format(new Date())+"\n"+reader.readLine()+"\n");
}
}catch (Exception e) {
e.printStackTrace();
}
try{
if (reader != null) {
reader.close();
}
if (socket != null){
socket.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
MyServer ms = new MyServer();
ms.setSize(500,480);
ms.setVisible(true);
ms.getServer();
}
}
客户端:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
import javax.swing.border.*;
public class MyClient extends JFrame{
BufferedReader reader;
private JTextArea ta= new JTextArea();;//多行输入
private JTextField tf=new JTextField();//单行输入
private static final long serialVersionUID = 1L;
private PrintWriter writer;
Socket socket;
Container cc;
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
public MyClient(String title){
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cc=this.getContentPane();
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane,BorderLayout.CENTER);
scrollPane.setViewportView(ta);
cc.add(tf,"South");
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//绑定事件
writer.println(tf.getText());
ta.append("Client: "+sd.format(new Date())+"\n");
ta.append(tf.getText()+'\n');
ta.setSelectionEnd(ta.getText().length());
tf.setText("");
}
});
}
public void connect(){
ta.append("try to connect!\n");
try {
socket = new Socket("127.0.0.1",2190);
ta.append("Complete connection!\n");
while(true){
writer = new PrintWriter(socket.getOutputStream(),true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getServerMessage();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void getServerMessage() {
try{
while(true) {
ta.append("Server: " +sd.format(new Date())+"\n"+reader.readLine()+"\n");
}
}catch (Exception e) {
e.printStackTrace();
}
try{
if (reader != null) {
reader.close();
}
if (socket != null){
socket.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
MyClient client = new MyClient("Send message to Server");
client.setVisible(true);
client.setResizable(false);
client.setSize(500,480);
client.connect();
}
}
登录界面:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoadingFrame extends JFrame implements ActionListener {
private JLabel j1;
private JLabel j2;
private JTextField UsernameInput;
private JPasswordField jpf;
private Container cc;
private JButton load;
public LoadingFrame(){
setSize(480, 500);
setTitle("Loading Frame");
cc = this.getContentPane();
cc.setBackground(Color.white);
cc.setLayout(new GridLayout(3, 1));
j1 = new JLabel();
j1.setText("UserName:");
UsernameInput = new JTextField(15);
JPanel jp1 = new JPanel();
jp1.add(j1);
jp1.add(UsernameInput);
cc.add(jp1);
j2 = new JLabel();
j2.setText("PassWord:");
jpf = new JPasswordField(15);
jpf.setEchoChar('*');
JPanel jp2 = new JPanel();
jp2.add(j2);
jp2.add(jpf);
cc.add(jp2);
load = new JButton("Log in");
cc.add(load);
load.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if("admin".trim().equals(UsernameInput.getText())&&"login".trim().equals(new String(jpf.getPassword()))){
MyClient client=new MyClient("Send message to Server");
setVisible(false);
client.setSize(500,480);
client.setResizable(false);
client.setVisible(true);
client.connect();
}else{
System.out.println("Wrong password!");
}
}
public static void main(String[] args) {
LoadingFrame ljf= new LoadingFrame();
}
}