
Server.java改善
~~~
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.ServerSocket;
import java.util.Vector;
public class Server extends JFrame implements ActionListener {
JLabel jlPort=new JLabel("端 口 號");//創建提示輸入端口號標簽
JTextField jtfPort=new JTextField("9999");//用于輸入端口號的文本框//z并給以默認值9999
JButton jbStart=new JButton("啟動");//創建"啟動"按鈕
JButton jbStop=new JButton("關閉");//創建"關閉"按鈕
JPanel jps=new JPanel();//創建一個JPanel對象//z把上面控件放入其中
JList jlUserOnline=new JList();//創建用于顯示當前用戶的JList//z左邊
JScrollPane jspx=new JScrollPane(jlUserOnline);//將顯示當前用戶的JList放在JScrollPane中
JSplitPane jspz=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspx,jps);//創建JSplitPane對象
ServerSocket ss;//聲明ServerSocket引用
ServerThread st;//聲明ServerThread引用//z下面肯定有new這個類,把這個線程用起來
Vector onlineList=new Vector();//創建存放當前在線用戶的Vector對象
public Server()
{
this.initialComponent();//初始化控件
this.addListener();//為相應的控件注冊事件監聽器
this.initialFrame();//初始化窗體
}
public void initialComponent()
{
jps.setLayout(null);//設為空布局
jlPort.setBounds(20,20,50,20);
jps.add(jlPort);//添加用于提示輸入端口號的標簽
this.jtfPort.setBounds(85,20,60,20);
jps.add(this.jtfPort);//添加用于輸入端口號的文本框
this.jbStart.setBounds(18,50,60,20);
jps.add(this.jbStart);//添加"開始"按鈕
this.jbStop.setBounds(85,50,60,20);
jps.add(this.jbStop);//添加"關閉"按鈕
this.jbStop.setEnabled(false);//將"關閉"按鈕設為不可用
}
public void addListener()
{
this.jbStart.addActionListener(this);//為"開始"按鈕注冊事件監聽器
this.jbStop.addActionListener(this);//為"關閉"按鈕注冊事件監聽器
}
public void initialFrame()
{
this.setTitle("象棋--服務器端");//設置窗體標題
Image image=new ImageIcon("ico.gif").getImage();
this.setIconImage(image);
this.add(jspz);//將JSplitPane添加到窗體中
jspz.setDividerLocation(250);
jspz.setDividerSize(4);//設置分割線的位置和寬度
this.setBounds(20,20,420,320);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);//設置可見性
this.addWindowListener(//為窗體關閉事件注冊監聽器//z右上角×的功能
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(st==null)//當服務器線程為空時直接退出
{
System.exit(0);//退出
return;//相當于break
}
try
{
Vector v=onlineList;
int size=v.size();
for(int i=0;i<size;i++)
{
//當不為空時,向在線用戶發送離線信息
ServerAgentThread tempSat=(ServerAgentThread)v.get(i);
tempSat.dout.writeUTF("<#SERVER_DOWN#>");
tempSat.flag=false;//終止服務器代理線程
}
st.flag=false;//終止服務器線程
st=null;
ss.close();//關閉ServerSocket
v.clear();//將在線用戶列表清空
refreshList();//刷新列表
}
catch(Exception ee)
{
ee.printStackTrace();
}
System.exit(0);//退出
}
}
);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==this.jbStart)
{//當單擊"啟動"按鈕時
/* System.out.println("服務器啟動成功");
this.jbStop.setEnabled(true);
this.jbStart.setEnabled(false);*/
this.jbStart_event();
}
else if(e.getSource()==this.jbStop)
{//單擊"關閉"按鈕后
/* System.out.println("服務器正常關閉");
this.jbStop.setEnabled(false);
this.jbStart.setEnabled(true);*/
this.jbStop_event();
}
}
public void jbStart_event() {
//單擊"啟動"按鈕的業務處理代碼
int port=0;//定義端口號
try
{
//獲得用戶輸入的端口號,并轉化為整型
port=Integer.parseInt(this.jtfPort.getText().trim());//z.trim()就是去除空格
}
catch(Exception ee)
{//端口號不是整數,給出提示信息//z彈出對話框
JOptionPane.showMessageDialog(this,"端口號只能是整數","錯誤",
JOptionPane.ERROR_MESSAGE);
return;
}
if(port>65535||port<0)
{//斷口號不合法,給出提示信息
JOptionPane.showMessageDialog(this,"端口號只能是0-65535的整數","錯誤",
JOptionPane.ERROR_MESSAGE);
return;
}
try
{
this.jbStart.setEnabled(false);//將開始按鈕設為不可用
this.jtfPort.setEnabled(false);//將用于輸入端口號的文本框設為不可用
this.jbStop.setEnabled(true);//將停止按鈕設為可用
ss=new ServerSocket(port);//創建ServerSocket對象
st=new ServerThread(this);//創建服務器線程
st.start();//啟動服務器線程
//給出服務器啟動成功的提示信息
JOptionPane.showMessageDialog(this,"服務器啟動成功","提示",
JOptionPane.INFORMATION_MESSAGE);
}
catch(Exception ee)
{
//給出服務器啟動失敗的提示信息
JOptionPane.showMessageDialog(this,"服務器啟動失敗","錯誤",
JOptionPane.ERROR_MESSAGE);
this.jbStart.setEnabled(true);//將開始按鈕設為可用
this.jtfPort.setEnabled(true);//將用于輸入端口號的文本框設為可用
this.jbStop.setEnabled(false);//將停止按鈕設為不可用
}
}
public void jbStop_event() {
//單擊"關閉"按鈕的業務處理代碼
try
{
Vector v=onlineList;
int size=v.size();
for(int i=0;i<size;i++)
{//向在線用戶發送離線信息
ServerAgentThread tempSat=(ServerAgentThread)v.get(i);
tempSat.dout.writeUTF("<#SERVER_DOWN#>");
tempSat.flag=false;//關閉服務器代理線程
}
st.flag=false;//關閉服務器線程
st=null;
ss.close();//關閉ServerSocket
v.clear();//將在線用戶列表清空
refreshList();//刷新列表
this.jbStart.setEnabled(true);//將開始按鈕設為可用
this.jtfPort.setEnabled(true);//將用于輸入端口號的文本框設為可用
this.jbStop.setEnabled(false);//將停止按鈕設為不可用
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
public void refreshList() {
//更新在線用戶列表的業務處理代碼
Vector v=new Vector();
int size=this.onlineList.size();
for(int i=0;i<size;i++)
{//遍歷在線列表
ServerAgentThread tempSat=(ServerAgentThread)this.onlineList.get(i);
String temps=tempSat.sc.getInetAddress().toString();
temps=temps+"|"+tempSat.getName();//獲得所需信息
v.add(temps);//添加到Vector中
}
this.jlUserOnline.setListData(v);//更新列表數據
}
public static void main(String args[])
{
new Server();
}
}
~~~
主要位置



結果

