?? servermain.java
字號:
package cr;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ServerMain extends JFrame implements ActionListener{
ListTable ltaOnline; //在線用戶的列表
JTextArea jtaChats; //聊天記錄的顯示區(qū)
JTextField jtfChat; //發(fā)言內(nèi)容的輸入框
JTextField jtfObject; //發(fā)言針對對象
JLabel jlaOnlineSum; //在線人數(shù)
JButton jbuKick; //“踢”按鈕
JButton jbuSend; //“發(fā)言”按鈕
ConnectPond cpoOnline; //聯(lián)接池對象
Vector vecConnectListener; //連接監(jiān)聽對象存放向量
public ServerMain() {
//初始化主界面
super("Xiang的聊天室的服務(wù)器端");
this.setSize(620,500);
Container conMain=this.getContentPane();
this.setDefaultCloseOperation(3);
jtaChats=new JTextArea();
ltaOnline=new ListTable();
cpoOnline=new ConnectPond();
JPanel jpaDown=new JPanel();
jbuKick=new JButton("踢");
jbuKick.addActionListener(this);
jbuSend=new JButton("發(fā)言");
jbuSend.addActionListener(this);
jlaOnlineSum=new JLabel("0");
jtfChat=new JTextField(25);
jtfObject=new JTextField(" 所有人 ");
jtfObject.setEditable(false);
jpaDown.add(jbuKick);
jpaDown.add(new JLabel("對:"));
jpaDown.add(jtfObject);
jpaDown.add(new JLabel("說:"));
jpaDown.add(jtfChat);
jpaDown.add(jbuSend);
jpaDown.add(new JLabel("在線人數(shù):"));
jpaDown.add(jlaOnlineSum);
conMain.add(new JScrollPane(jtaChats),BorderLayout.CENTER);
conMain.add(ltaOnline,BorderLayout.EAST);
conMain.add(jpaDown,BorderLayout.SOUTH);
this.setVisible(true);
ltaOnline.addElement("所有人");
vecConnectListener=new Vector();
this.validate();
//建立連接
listenConnect();
}
void listenConnect(){
ServerSocket ssoConnect = null; //用于監(jiān)聽連接到服務(wù)器的連接
Socket socConnect=null; //臨時存放新得到的連接套接字
BufferedReader breTemp=null; //臨時存放新建連接的輸入流
PrintWriter pwrTemp=null; //臨時存放新建連接的輸出流
String strTemp=null; //字符串臨時變量
int intSum=1; //更改用戶昵稱用到的變量
try {
ssoConnect = new ServerSocket(4000); //檢測本機(jī)的4000端口
} catch (IOException ex1) {
System.out.println("建立ServerSocket失敗!");
}
while (true){ //永久循環(huán)檢測
try {
socConnect = ssoConnect.accept(); //檢測到新連接賦值
} catch (IOException ex) {
System.out.println("建立Socket失敗!");
}
try { //獲取輸入輸出流
breTemp = new BufferedReader(new InputStreamReader(socConnect.
getInputStream()));
pwrTemp=new PrintWriter(socConnect.getOutputStream(),true);
} catch (IOException ex2) {
System.out.println("獲取IO流失敗!");
}
int intOnlineSum=ltaOnline.getSum()+1; //計算給客戶端發(fā)送的在線聊友列表
//的數(shù)目,“所有人”項(xiàng)一并統(tǒng)計在內(nèi)
pwrTemp.println(""+intOnlineSum); //發(fā)送數(shù)目
for (int i=0;i<intOnlineSum;i++){ //發(fā)送具體昵稱
pwrTemp.println(ltaOnline.isName(i));
}
try {
strTemp=breTemp.readLine(); //接收用戶定義的昵稱
if (ltaOnline.isBeing(strTemp)){ //判斷昵稱已經(jīng)存在
strTemp+="克隆"+(intSum++)+"代"; //改名
pwrTemp.println("TRUE"); //通知客戶端接收新昵稱
pwrTemp.println(strTemp); //向客戶端發(fā)送新昵稱
}
else
pwrTemp.println("FALSE"); //昵稱沒有重復(fù)
jtaChats.append("系統(tǒng)廣播:歡迎"+strTemp+"來到本聊天室\n");
} catch (IOException ex3) {
System.out.println("讀數(shù)據(jù)失敗!");
}
ltaOnline.addElement(strTemp); //將新來者加入到在線人員列表
cpoOnline.add(socConnect); //將新來者加入到聯(lián)接池
ConnectListen cliTemp=new ConnectListen(socConnect,this); //為新來者建立一個監(jiān)聽對象
cliTemp.start();
vecConnectListener.addElement(cliTemp); //保存監(jiān)聽對象
jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在線人數(shù)
cpoOnline.sendAll("ADD"); //通知所有在線客戶端增加一個聊友
cpoOnline.sendAll(strTemp); //通知所有在線客戶端新聊友的昵稱
cpoOnline.sendAll("系統(tǒng)廣播:歡迎"+strTemp+"來到本聊天室");
}
}
class ListTable extends JPanel implements MouseListener{
private BaTable jtaMain; //用于顯示聊友昵稱的表
private Vector vecHead, //表頭
vecData; //數(shù)據(jù)體
ListTable(){
super();
vecHead=new Vector();
vecData=new Vector();
vecHead.add("asdsssssssss");
jtaMain=new BaTable(vecData,vecHead); //創(chuàng)建一個初始列表
jtaMain.addMouseListener(this); //加鼠標(biāo)監(jiān)聽
this.add(jtaMain);
}
//在表中增加一個聊友昵稱
void addElement(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
vecData.add(vecRow);
jtaMain.revalidate();
}
//在表中刪除一個聊友昵稱
void delElement(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
vecData.removeElement(vecRow);
jtaMain.revalidate();
}
//獲取列表中的人數(shù)
int getSum(){
return vecData.size()-1; //減去“所有人”項(xiàng)
}
//判斷某個昵稱是否有人在使用
boolean isBeing(String strElement){
Vector vecRow=new Vector();
vecRow.add(strElement);
return vecData.contains(vecRow);
}
//獲取某個序號的聊友昵稱
String isName(int intTemp){
Vector vecRow=(Vector)vecData.get(intTemp);
return (String)vecRow.get(0);
}
//獲取某個昵稱的聊友的序號
int getIndex(String strName){
Vector vecRow=new Vector();
vecRow.add(strName);
return vecData.indexOf(vecRow);
}
void refurbish(){
this.setVisible(false);
this.setVisible(true);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
//在聊友列表中點(diǎn)擊某個聊友時,將其昵稱填入到聊天對象框中
jtfObject.setText((String)jtaMain.getValueAt(jtaMain.getSelectedRow(),0));
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
//繼承一個JTable,將表項(xiàng)的缺省模式改為不可編輯
public class BaTable extends JTable{
public BaTable(){super();} //缺省構(gòu)造方法
public BaTable(Vector data, Vector head){ //向量構(gòu)造方法
super(data,head);
}
public boolean isCellEditable(int row,int column){
return false; } //表項(xiàng)不可編輯
}
public static void main(String args[]){
new ServerMain();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==jbuSend){ //點(diǎn)擊“發(fā)言”按鈕
if (jtfObject.getText().trim().equals("所有人")){ //發(fā)言對象是所有人
cpoOnline.sendAll("服務(wù)器公告:"+jtfChat.getText());
jtaChats.append("服務(wù)器公告:"+jtfChat.getText()+"\n");
}
else { //發(fā)言對象是某個聊友
cpoOnline.sendTo(ltaOnline.getIndex(jtfObject.getText().trim())-1,
"管理員對你說:"+jtfChat.getText());
jtaChats.append("管理員對"+jtfObject.getText()+"說:"+jtfChat.getText()+"\n");
}
}
if (e.getSource()==jbuKick){ //點(diǎn)擊“踢”按鈕
if(jtfObject.getText().trim().equals("所有人")){ //企圖踢"所有人"
jtaChats.append("把所有都踢走了就沒人陪你聊天了:(");
}
else { //“請”某個聊友出聊天室
int intObject=ltaOnline.getIndex(jtfObject.getText().trim())-1; //得到其序號
cpoOnline.sendTo(intObject,"你被管理員請請出了聊天室"); //給該聊友發(fā)送“請?zhí)? jtaChats.append(jtfObject.getText().trim()+"被管理員請出了聊天室\n");
ltaOnline.delElement(jtfObject.getText().trim()); //服務(wù)器在線人員列表刪除目標(biāo)
// ltaOnline.refurbish();
jlaOnlineSum.setText(""+ltaOnline.getSum()); //更新在線人數(shù)
cpoOnline.remove(intObject); //連接池中刪除相應(yīng)連接
ConnectListen cliTemp=(ConnectListen)vecConnectListener.get(intObject); //獲得對其的監(jiān)聽對象
vecConnectListener.remove(intObject); //刪除監(jiān)聽該連接的對象
cliTemp.booKick=true; //在目標(biāo)的監(jiān)聽對象中標(biāo)識為被踢
try {
cliTemp.socket.close(); //關(guān)閉該連接
} catch (IOException ex) {
}
cpoOnline.sendAll("DEL"); //通知在線客戶端刪除一個聊友
cpoOnline.sendAll(jtfObject.getText().trim()); //發(fā)送該聊友的昵稱
cpoOnline.sendAll(jtfObject.getText().trim()+"被管理員請出了聊天室");
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -