📄 serverframe.java
字号:
/*
* Created on 2005-12-18
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package chatRoom;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
/**
* @author hongyuan
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
//服务器主框架类
public class ServerFrame extends JFrame {
private JButton jbStartServer;//启动服务器按钮
private JButton jbStopServer;//关闭服务器按钮
private Border border;//用于设定按钮边框
private ServerSocket serverSocket;//侦听套接字
private JComboBox comboBox;//用于显示在线用户的组合选择框
private JTextArea textArea;//用于显示各种聊天信息的文本框
private JTextField textField;//用于显示在线用户数的文本行
private JTextField systemMsg;//用于编辑系统信息的文本行
private UserInfoList userInfoList;//用户信息链表
private ServerListenThread listenThread; //侦听线程
public ServerFrame()
{
super("聊天服务器");
init();
setSize(370,570);
setVisible(true);//显示窗口
}
public void init()//完成界面的初始化功能
{
Border bevelBorder=BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.white,Color.white,Color.white,Color.white);
Border emptyBorder=BorderFactory.createEmptyBorder(1,1,1,1);
//定义按钮边框
border=BorderFactory.createCompoundBorder(bevelBorder,emptyBorder);
jbStartServer=new JButton("启动服务器");
jbStopServer=new JButton("关闭服务器");
jbStopServer.setEnabled(false);//初始化关闭按钮为“禁止”状态
jbStartServer.addActionListener(//为启动服务器按钮注册事件处理程序
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
startServer();//启动服务
}
}
);
jbStopServer.addActionListener(//为关闭服务器按钮注册事件处理程序
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
stopServer();//关闭服务
}
}
);
//创建用户列表组合框
comboBox=new JComboBox();
comboBox.insertItemAt("all",0);
comboBox.setSelectedIndex(0);//设置默认选中列表框中的all项
textArea=new JTextArea(20,20);
textArea.setEditable(false);//在线用户组合框为只读
textField=new JTextField(40);
textField.setEditable(false);//显示在线用户数的文本行为只读
systemMsg=new JTextField(40);
systemMsg.setEnabled(false);
systemMsg.addActionListener(//为系统消息框注册监听程序
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
sendSystemMsg();//发送系统消息
}
}
);
this.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
stopServer();
System.exit(0);
}
}
);
Container c=getContentPane();//得到画布
c.setLayout(null);
jbStartServer.setBorder(border);//设置按钮边框
jbStartServer.setBounds(30,30,90,30);//设置按钮位置
jbStopServer.setBorder(border);//设置按钮边框
jbStopServer.setBounds(150,30,90,30);//设置按钮位置
textField.setBounds(30,75,300,20);
textArea.setBounds(30,110,300,300);
comboBox.setBounds(30,425,90,30);
systemMsg.setBounds(30,470,300,20);
c.add(jbStartServer);
c.add(jbStopServer);
c.add(textField);
c.add(textArea);
c.add(comboBox);
c.add(systemMsg);
}
public void startServer()
{
try
{
serverSocket=new ServerSocket(8000,10);//创建侦听套接字
textArea.append("server start at 8000 port...\n");
//调整界面控件
jbStartServer.setEnabled(false);
jbStopServer.setEnabled(true);
systemMsg.setEnabled(true);
}catch(Exception e){}
userInfoList=new UserInfoList();//创建在线用户信息列表
//创建服务器侦听线程
listenThread=new ServerListenThread(serverSocket,comboBox,textArea,textField,userInfoList);
listenThread.start();
}
public void stopServer()
{
try
{
textArea.append("server stop...\n");
sendStopToAll();//向所有在线用户发送服务器关闭消息
listenThread.isStop=true;
serverSocket.close();//关闭侦听套接字
int count=userInfoList.getCount();//得到在线用户个数
int i=0;
while(i<count)
{
Node node=userInfoList.find(i);//根据索引,查找用户
node.input.close();//关闭输入流
node.output.close();//关闭输出流
node.socket.close();//关闭套接字
i++;
}
//调整控件
jbStartServer.setEnabled(true);
jbStopServer.setEnabled(false);
systemMsg.setEnabled(false);
//删除在线用户列表组合框中的列表项
comboBox.removeAllItems();
comboBox.addItem("all");
}catch(Exception e){}
}
public void sendStopToAll()
{
int count=userInfoList.getCount();
int i=0;
//依次遍历用户信息链表
while(i<count)
{
Node node=userInfoList.find(i);
if(node==null)
{
i++;
continue;
}
try
{
//准备消息
node.output.writeObject("服务关闭");
node.output.flush();//发送消息
}catch(Exception e){}
i++;
}
}
public void sendSystemMsg()
{
//得到消息发送对象
String toSomebody=comboBox.getSelectedItem().toString();
String message=systemMsg.getText();//得到消息内容
if(toSomebody.equalsIgnoreCase("all"))//判断发送对象是否为全体在线用户
{
sendMsgToAll(message);//向所有用户发送系统消息
}
else
{
Node node=userInfoList.find(toSomebody);
try
{
node.output.writeObject("系统信息:");//发送系统消息标识
node.output.flush();
node.output.writeObject(message);//发送系统消息内容
node.output.flush();
}catch(Exception e){}
}
}
public void sendMsgToAll(String msg)//向所有在线用户发送系统消息
{
int count=userInfoList.getCount();//得到用户链表元素个数
int i=0;
//依次遍历用户链表,发送系统消息
while(i<count)
{
Node node=userInfoList.find(i);
if(node==null)
{
i++;
continue;
}
try
{
node.output.writeObject("系统消息:");//发送系统消息标识
node.output.flush();
node.output.writeObject(msg);//发送消息内容
node.output.flush();
}catch(Exception e){}
i++;
}
}
public static void main(String []args)
{
new ServerFrame();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -