📄 chatserver.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class chatServer extends JFrame
{ //以下为图形界面变量
JPanel contentPane;
JMenuBar jMenuBar1 = new JMenuBar();
JMenu jMenuFile = new JMenu();
JMenuItem jMenuFileExit = new JMenuItem();
JMenu jMenuHelp = new JMenu();
JMenuItem jMenuHelpAbout = new JMenuItem();
JLabel statusBar = new JLabel();
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
BorderLayout borderLayout2 = new BorderLayout();
JLabel jLabel1 = new JLabel();
static java.awt.List jList1 = new java.awt.List(13);
JScrollPane scrollpane=new JScrollPane(jList1);
//---------------------
JPanel broadpanel = new JPanel();
JLabel blab = new JLabel();
JTextField btxt=new JTextField(30);
JButton bbut=new JButton();
//以下为网络相关变量
static Vector clients=new Vector(10); //用vector向量数组存储连接客户变量
static ServerSocket server=null; //建立服务器socket
static int active_connects=0; //用来存储目前连接的客户数
static Socket socket=null; //用来存储一个套接字连接
//chatServer main method
public static void main(String[] args)
{
try
{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e)
{ e.printStackTrace();
}
chatServer chatServer1=new chatServer(); //实例化一个chatServer类
chatServer1.show();
System.out.println("Server starting ...");
try
{ server=new ServerSocket(2525); //使用端口2525初始化服务器套接字
}
catch(IOException e)
{ System.out.println("Error:"+e);
}
while(true)
{ if(clients.size()<5) //当客户数小于5个时开始连接
{ try
{ socket=server.accept(); //用来存储连接上的客户socket
if(socket!=null)
{ System.out.println(socket+"连接"); //在控制台打印客户连接信息
}
}
catch(IOException e)
{ System.out.println("Error:"+e);
}
int i=0;
do
{ Client c=new Client(socket); //定义并实例化一个Client线程类,一个就对应一个客户连接
clients.addElement(c); //加入clients数组中
if(checkName(c)) //调用checkName方法验证c的合法性
{ int connum=++chatServer1.active_connects; //定义connum来存储活动连接数
String constr="目前有"+connum+"客户相连"; //在状态栏里显示连接数
chatServer1.statusBar.setText(constr);
Client listdata=(Client)clients.elementAt(i); //将连接客户的socket信息存储进listdata数组
chatServer1.jList1.addItem(listdata.ip+"连接",i); //将客户socket信息写入list框
c.start(); //启动线程
notifyconnect(c.name);
try{ Thread.sleep(2000);
}
catch(Exception e){} //启动线程
notifyRoom(); //用notifyRoom方法来监视聊天室连接变化
//不断改变clients数组并刷新客户端信息
}
else
{ //如果名字不合法
c.ps.println("TAKEN");
disconnect(c);
}
i++;
break;
}
while(i<clients.size());
}
else //如果clients数组超过了5个
{ try{Thread.sleep(200);}
catch(InterruptedException e){}
}
}//end of while
}// end of main method
/**Construct the frame*/
public chatServer() //chatServer类的构造器用来初始化一些UI信息
{ enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{ jbInit();
}
catch(Exception e)
{ e.printStackTrace();
}
}
/**Component initialization*/
private void jbInit() throws Exception
{ contentPane=(JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(400,300));
this.setTitle("简易聊天服务器端");
statusBar.setText("目前的连接数为:");
jMenuFile.setText("File");
jMenuFileExit.setText("Exit");
jMenuFileExit.addActionListener
(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{jMenuFileExit_actionPerformed(e);
}
});
jMenuHelp.setText("Help");
jMenuHelpAbout.setText("About");
jMenuHelpAbout.addActionListener
(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{jMenuHelpAbout_actionPerformed(e);
}
});
//system message
broadpanel.setLayout(new FlowLayout());
blab.setText(" 系统广播 ");
btxt.setText(" 请输入系统广播内容 ");
bbut.setLabel("发送");
broadpanel.add(blab);
broadpanel.add(btxt);
broadpanel.add(bbut);
bbut.addActionListener
(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ broadbut_actionPerformed(e);
}
});
jPanel1.setLayout(borderLayout2);
jLabel1.setText("服务器端连接客户");
jMenuFile.add(jMenuFileExit);
jMenuHelp.add(jMenuHelpAbout);
jMenuBar1.add(jMenuFile);
jMenuBar1.add(jMenuHelp);
this.setJMenuBar(jMenuBar1);
contentPane.add(statusBar,BorderLayout.SOUTH);
contentPane.add(jPanel1,BorderLayout.CENTER);
jPanel1.add(jLabel1,BorderLayout.NORTH);
jPanel1.add(scrollpane,BorderLayout.CENTER);
jPanel1.add(broadpanel,BorderLayout.SOUTH);
}//end of jbinit
//send system message
public void broadbut_actionPerformed(ActionEvent e)
{ //sendClients("SYSMSG");
if(clients.size()>0)
{ StringBuffer sysmsg=new StringBuffer("SYSMSG");
sysmsg.append(":"+btxt.getText());
sendClients(sysmsg);
btxt.setText("");
}
else
{ JOptionPane.showMessageDialog(null,"no user","Server ",JOptionPane.ERROR_MESSAGE);
}
}
/**File | Exit action performed*/
public void jMenuFileExit_actionPerformed(ActionEvent e) //实现退出菜单方法
{ sendClients(new StringBuffer("QUIT")); //向客户端发送断开连接信息
closeAll(); //调用closeAll方法关闭所有连接
System.exit(0);
}
/**Help | About action performed*/
public void jMenuHelpAbout_actionPerformed(ActionEvent e) //实现about对话框,意义不大,可以去掉
{ chatServer_AboutBox dlg=new chatServer_AboutBox(this);
Dimension dlgSize=dlg.getPreferredSize();
Dimension frmSize=getSize();
Point loc=getLocation();
dlg.setLocation((frmSize.width-dlgSize.width)/2+loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
dlg.setModal(true);
dlg.show();
}
/**Overridden so we can exit when window is closed*/
protected void processWindowEvent(WindowEvent e) //实现关闭服务器程序要进行的操作
{ super.processWindowEvent(e);
if (e.getID()==WindowEvent.WINDOW_CLOSING)
{ jMenuFileExit_actionPerformed(null);
}
}
/*以下实现各种方法*/
public static void notifyRoom() //用来监视连接信息,不断刷新clients数组并刷新客户端用户列表信息
{ StringBuffer people=new StringBuffer("PEOPLE");
for(int i=0;i<clients.size();i++)
{ Client c=(Client)clients.elementAt(i);
people.append(":"+c.name);
}
sendClients(people); //用sendClients方法向客户端发送信息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -