⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverframe.java

📁 这是我课程设计的时候做的聊天程序
💻 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 + -