📄 client.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class Client extends JFrame implements ActionListener{
JPanel panelLogin;
JPanel panelBack;
JPanel panelTalk;
JLabel labelServerIP;
JLabel labelName;
JLabel labelPassword;
JTextArea textViewTalk;
JLabel labelTalk;
JLabel labelTo;
JTextField textTalk;
JTextField textServerIP;
JTextField textName;
JPasswordField textPassword;
JButton buttonTalk;
JButton buttonLogin;
JButton buttonReg;
JComboBox listOnline;
GridBagLayout gl;
BorderLayout bdl;
GridBagConstraints gbc;
JDialog dialogLogin=new JDialog(this,"Login",true);
Socket socket;
BufferedReader in;
PrintWriter out;
String strSend, strReceive, strKey, strStatus;
private StringTokenizer st;
public Client(){//初始化
gl = new GridBagLayout();
bdl = new BorderLayout();
gbc = new GridBagConstraints();
panelBack = (JPanel)getContentPane();
panelBack.setLayout(bdl);
panelLogin = new JPanel();
panelLogin.setLayout(gl);
//初始化控件
labelServerIP = new JLabel("Server IP:");
labelName = new JLabel("UserName:");
labelPassword = new JLabel("Password:");
textServerIP = new JTextField(12);
textName = new JTextField(12);
textPassword = new JPasswordField(12);
buttonLogin=new JButton("Login");
buttonTalk = new JButton("Send");
buttonReg =new JButton("Register");
labelTalk = new JLabel("Talk :");
labelTo = new JLabel(" To :");
textTalk = new JTextField(30);
panelTalk = new JPanel();
textViewTalk = new JTextArea(18,40);
listOnline = new JComboBox();
buttonLogin.addActionListener(this);
buttonTalk.addActionListener(this);
buttonReg.addActionListener(this);
listOnline.addItem("All");
panelTalk.add(labelTalk);
panelTalk.add(textTalk);
panelTalk.add(labelTo);
panelTalk.add(listOnline);
panelTalk.add(buttonTalk);
panelBack.add("Center",textViewTalk);
panelBack.add("South",panelTalk);
buttonTalk.setEnabled(false);
setSize(600,450);
show();
// 登陆对话框初始化
dialogLogin.getContentPane().setLayout(new FlowLayout());
dialogLogin.getContentPane().add(labelServerIP);
dialogLogin.getContentPane().add(textServerIP);
dialogLogin.getContentPane().add(labelName);
dialogLogin.getContentPane().add(textName);
dialogLogin.getContentPane().add(labelPassword);
dialogLogin.getContentPane().add(textPassword);
dialogLogin.getContentPane().add(buttonLogin);
dialogLogin.getContentPane().add(buttonReg);
dialogLogin.setBounds(300,300,250,200);
dialogLogin.show();
}
public static void main(String[] args){
new Client();
}
//建立与服务端通信的套接字
void connectServer(){
try{
socket=new Socket(textServerIP.getText(),8049);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
}
catch(ConnectException e){
JOptionPane.showMessageDialog(this,"连接服务器失败!","ERROE", JOptionPane.
INFORMATION_MESSAGE);
textServerIP.setText("");
System.out.println(e);
}
catch(Exception e){
System.out.println(e);
}
}
// 弹出窗口
public void popWindows(String strWarning,String strTitle){
JOptionPane.showMessageDialog(this,strWarning,strTitle,JOptionPane.INFORMATION_MESSAGE);
}
private void initLogin() throws IOException{
strReceive = in.readLine();
st = new StringTokenizer(strReceive,"|");
strKey = st.nextToken();
if(strKey.equals("login")){
strStatus = st.nextToken();
if(strStatus.equals("succeed")){
buttonLogin.setEnabled(false);
buttonTalk.setEnabled(true);
panelLogin.setVisible(false);
dialogLogin.dispose();
new ClientThread(socket);
out.println("init|online");
}
popWindows(strKey+" "+strStatus+"!","Login");
}
if(strKey.equals("warning")){
strStatus = st.nextToken();
popWindows(strStatus,"Register");
}
}
public void actionPerformed(ActionEvent evt){
Object obj=evt.getSource();
try{
if(obj==buttonLogin){
if((textServerIP.getText().length()>0)&&(textName.getText().length()>0)
&&(textPassword.getText().length()>0)){
connectServer();
strSend = "login|"+textName.getText()+"|"+String.valueOf
(textPassword.getPassword());
out.println(strSend);
initLogin();
}
else{
popWindows("将输入完整信息","ERROE");
}
}
else if(obj==buttonReg){
if((textName.getText().length()>0)&&(textPassword.getText().length()>0)){
connectServer();
strSend="reg|"+textName.getText()+"|"+String.valueOf
(textPassword.getPassword());
out.println(strSend);
initLogin();
}
}
else if(obj==buttonTalk){
if(textTalk.getText().length()>0){
out.println("talk|"+textTalk.getText()+"|"+textName.getText()+"|"+
listOnline.getSelectedItem().toString());
textTalk.setText("");
}
}
}
catch(Exception e)
{
System.out.println(e);
}
}
class ClientThread implements Runnable {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private String strReceive, strKey;
private Thread threadTalk;
private StringTokenizer st;
public ClientThread(Socket s) throws IOException{
this.socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
threadTalk = new Thread(this);
threadTalk.start();
}
public void run(){
while(true){
synchronized(this){
try{
strReceive = in.readLine();
st = new StringTokenizer(strReceive,"|");
strKey = st.nextToken();
if(strKey.equals("talk")){
String strTalk = st.nextToken();
strTalk = textViewTalk.getText()+"\r\n "+strTalk;
textViewTalk.setText(strTalk);
}
else if(strKey.equals("online")){
String strOnline;
while(st.hasMoreTokens()){
strOnline=st.nextToken();
listOnline.addItem(strOnline);
}
}
else if(strKey.equals("remove")){
String strRemove;
while(st.hasMoreTokens()){
strRemove=st.nextToken();
listOnline.removeItem(strRemove);
}
}
else if(strKey.equals("warning")){
String strWarning = st.nextToken();
popWindows(strWarning,"Warning");
}
Thread.sleep(1000);
}
catch(InterruptedException e){}
catch(IOException e){}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -