/************************************************/
//用户端
/************************************************/
package clientPackage;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JList;
import javax.swing.JRadioButton;
import java.awt.Dimension;
import javax.swing.JSplitPane;
public class ClientDemo extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JPanel jPanel = null;
private JLabel jLabel = null;
private JLabel jLabel1 = null;
private JTextField userName = null;
private JButton link = null;
private JScrollPane jScrollPane = null;
private JTextArea talk = null;
private JPanel jPanel1 = null;
private JList list = null;
private JPanel jPanel2 = null;
private JLabel jLabel2 = null;
private JRadioButton all = null;
private JRadioButton one = null;
private JPanel jPanel3 = null;
private JTextField userNumber = null;
private JButton exit = null;
private JButton send = null;
private JTextField jTextField1 = null;
protected Socket socket = null; // @jve:decl-index=0:
private DefaultListModel data=new DefaultListModel();
private final int PORT=6886;
private final String HOSTNAME="127.0.0.1";
private int count=0;
private String name=null;
private String ip=null;
private BufferedReader reader=null; // @jve:decl-index=0:
private PrintWriter writer=null; // @jve:decl-index=0:
private receiveThread clientGO=null;//接收消息的线程
private JScrollPane jScrollPane1 = null;
private JSplitPane jSplitPane = null;
/**
* This method initializes jPanel
* @return javax.swing.JPanel
private JPanel getJPanel() {
if (jPanel == null) {
jLabel1 = new JLabel();
jLabel1.setText("连接用户名");
jLabel = new JLabel();
jLabel.setText("在线用户");
GridLayout gridLayout = new GridLayout();
gridLayout.setRows(1);
jPanel = new JPanel();
jPanel.setLayout(gridLayout);
jPanel.add(jLabel, null);
jPanel.add(jLabel1, null);
jPanel.add(getUserName(), null);
jPanel.add(getLink(), null);
return jPanel;
}
/**
* This method initializes userName
* @return javax.swing.JTextField
private JTextField getUserName() {
if (userName == null) {
userName = new JTextField();
return userName;
}
/**
* This method initializes link
* @return javax.swing.JButton
private JButton getLink() {
if (link == null) {
link = new JButton();
link.setText("链接");
link.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
connect(PORT);//连接服务器
link.setEnabled(false);
});
return link;
}
/**
* This method initializes jScrollPane
* @return javax.swing.JScrollPane
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getTalk());
return jScrollPane;
}
/**
* This method initializes talk
* @return javax.swing.JTextArea
private JTextArea getTalk() {
if (talk == null) {
talk = new JTextArea();
talk.setEditable(false);
return talk;
}
/**
* This method initializes jPanel1
* @return javax.swing.JPanel
private JPanel getJPanel1() {
if (jPanel1 == null) {
jPanel1 = new JPanel();
jPanel1.setLayout(new BorderLayout());
jPanel1.add(getJPanel2(), BorderLayout.SOUTH);
jPanel1.add(getJScrollPane1(), BorderLayout.CENTER);
return jPanel1;
}
/**
* This method initializes list
* @return javax.swing.JList
*/
private JList getList() {
if (list == null) {
list = new JList(data);
list.setSize(new Dimension(100, 140));
return list;
}
/**
* This method initializes jPanel2
* @return javax.swing.JPanel
private JPanel getJPanel2() {
if (jPanel2 == null) {
jLabel2 = new JLabel();
jLabel2.setText("选择消息发送方式:");
GridLayout gridLayout1 = new GridLayout();
gridLayout1.setRows(3);
jPanel2 = new JPanel();
jPanel2.setLayout(gridLayout1);
jPanel2.add(jLabel2, null);
jPanel2.add(getAll(), null);
jPanel2.add(getOne(), null);
return jPanel2;
}
/**
* This method initializes all
* @return javax.swing.JRadioButton
private JRadioButton getAll() {
if (all == null) {
all = new JRadioButton();
all.setText("群发");
all.setSelected(true);
all.setVisible(true);
all.setEnabled(false);
return all;
}
/**
* This method initializes one
* @return javax.swing.JRadioButton
private JRadioButton getOne() {
if (one == null) {
one = new JRadioButton();
one.setText("单人发送");
one.setEnabled(false);
return one;
}
/**
* This method initializes jPanel3
* @return javax.swing.JPanel
private JPanel getJPanel3() {
if (jPanel3 == null) {
jPanel3 = new JPanel();
jPanel3.setLayout(new BorderLayout());
jPanel3.add(getUserNumber(), BorderLayout.SOUTH);
jPanel3.add(getExit(), BorderLayout.WEST);
jPanel3.add(getSend(), BorderLayout.EAST);
jPanel3.add(getJTextField1(), BorderLayout.CENTER);
return jPanel3;
}
/**
* This method initializes userNumber
* @return javax.swing.JTextField
private JTextField getUserNumber() {
if (userNumber == null) {
userNumber = new JTextField();
userNumber.setEditable(false);
userNumber.setText("目前在线人数:0");
return userNumber;
}
/**
* This method initializes exit
* @return javax.swing.JButton
private JButton getExit() {
if (exit == null) {
exit = new JButton();
exit.setText("断开链接");
exit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
disconnect();//断开链接
link.setEnabled(true);
});
return exit;
}
/**
* This method initializes send
* @return javax.swing.JButton
private JButton getSend() {
if (send == null) {
send = new JButton();
send.setText("发送");
send.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sendMessage("());
});
return send;
}
* This method initializes jTextField1
* @return javax.swing.JTextField
private JTextField getJTextField1() {
if (jTextField1 == null) {
jTextField1 = new JTextField();
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
sendMessage("());
});
return jTextField1;
}
/**
* This method initializes jScrollPane1
* @return javax.swing.JScrollPane
private JScrollPane getJScrollPane1() {
if (jScrollPane1 == null) {
jScrollPane1 = new JScrollPane();
jScrollPane1.setViewportView(getList());
return jScrollPane1;
}
/**
* This method initializes jSplitPane
* @return javax.swing.JSplitPane
private JSplitPane getJSplitPane() {
if (jSplitPane == null) {
jSplitPane = new JSplitPane();
jSplitPane.setOneTouchExpandable(true);
jSplitPane.setContinuousLayout(true);
jSplitPane.setDividerLocation(190);
jSplitPane.setRightComponent(getJScrollPane());
jSplitPane.setLeftComponent(getJPanel1());
return jSplitPane;
}
/**
* @param args
public static void main(String[] args) {
new ClientDemo();
}
/**
* This is the default constructor
*/
public ClientDemo() {
super();
initialize();
setVisible(true);
}
/**
* This method initializes this
* @return void
private void initialize() {
this.setSize(595, 343);
this.setContentPane(getJContentPane());
this.setTitle("客户机");
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
if(socket!=null){//还没有断开链接
disconnect();
dispose();
System.exit(0);
}
ButtonGroup b=new ButtonGroup();
b.add(all);b.add(one);
}
/**
* This method initializes jContentPane
* @return javax.swing.JPanel
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJPanel(), BorderLayout.NORTH);
jContentPane.add(getJPanel3(), BorderLayout.SOUTH);
jContentPane.add(getJSplitPane(), BorderLayout.CENTER);
return jContentPane;
/******************************************************************************/
/******************************************************************************/
public void connect(int port){
try {
socket=new Socket(HOSTNAME,port);
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream());
String line="";
line=reader.readLine();
talk.append(line+"\n");
//发送用户信息给服务器
name=userName.getText();
ip=socket.getLocalAddress().toString();
writer.println(name+"@"+ip);
writer.flush();
userName.setEditable(false);
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
talk.append("错误:找不到服务器"+e.toString()+"\n");
link.setEnabled(true);
} catch (IOException e) {
// TODO 自动生成 catch 块
talk.append("错误:连接失败"+e.toString()+"\n");
link.setEnabled(true);
clientGO=new receiveThread(reader);//启动获取服务器信息的线程
clientGO.start();
//断开链接
public void disconnect(){
if(socket==null){
JOptionPane.showMessageDialog(this, "还没有建立连接,不能断开。", "Error", JOptionPane.ERROR_MESSAGE);
return ;
userName.setEditable(true);
data.removeAllElements();//删除所有列表信息
count=0;
userNumber.setText("目前在线人数:"+count);
try{
sendMessage("QUIT");
clientGO.go=false;//停止读取来自服务器消息的线程
clientGO.stop();
socket.close();
socket=null;
talk.append("成功断开链接!\n");
userNumber.setText("目前在线人数:"+count);
}catch(IOException e){e.printStackTrace();talk.append("错误:关闭链接出错 "+e.toString()+"\n");}
//发送消息
public void sendMessage(String msg){
if(socket==null||writer==null){
JOptionPane.showMessageDialog(this, "连接已断开", "Error", JOptionPane.ERROR_MESSAGE);
return ;
try{
writer.println(msg);
writer.flush();
jTextField1.setText(null);
}catch(Exception e){e.printStackTrace();talk.append("发送消息失败:"+e.toString());}
//接受消息的线程
class receiveThread extends Thread {
BufferedReader reader=null;
Boolean go=true;
public receiveThread(BufferedReader reader){
this.reader=reader;
public void run(){
String line=null;
String sort=null;
try{
while(go){
line=reader.readLine();
sort=null;
StringTokenizer st=new StringTokenizer(line,"@");
if(st.hasMoreTokens())
sort=st.nextToken();//类型
if(line==null)
go=false;
if(sort.equalsIgnoreCase("EXIT")){//服务器关闭{
go=false;
line="SERVER:服务器关闭!";
writer.close();
reader.close();
socket.close();
socket=null;
talk.append("由于服务器关闭,自动断开链接!\n");
link.setEnabled(true);
data.removeAllElements();
count=0;
userNumber.setText("目前在线人数:"+count);
else if(sort.equalsIgnoreCase("MSG")){
line=st.nextToken();
else if(sort.equalsIgnoreCase("FULL")){
line="SERVER:服务器缓冲区已满!请稍后尝试链接!";
writer.close();
reader.close();
socket.close();
socket=null;
go=false;//结束线程
else if(sort.equalsIgnoreCase("PEOPLE")){//更新列表
data.removeAllElements();
while(st.hasMoreTokens()){
data.addElement(st.nextToken());
count=data.getSize();
userNumber.setText("目前在线人数:"+count);
line="\t\t\t在线列表已更新!";
else line="辨别类型失败!";
talk.append(line+"\n");
}catch(IOException ioe){ioe.printStackTrace();talk.append(ioe.toString()+"\n");}
}
} // @jve:decl-index=0:visual-constraint="25,0"