用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

通信 chat server

2014-03-05 作者: 云代码会员举报

[java]代码库

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
 
/*
 * 聊天服务端的主框架类
 */
public class ChatServer extends JFrame implements ActionListener{
 
    public static int port = 8888;//服务端的侦听端口
 
    ServerSocket serverSocket;//服务端Socket
    Image icon;//程序图标
    JComboBox combobox;//选择发送消息的接受者
    JTextArea messageShow;//服务端的信息显示
    JScrollPane messageScrollPane;//信息显示的滚动条
    JTextField showStatus;//显示用户连接状态
    JLabel sendToLabel,messageLabel;
    JTextField sysMessage;//服务端消息的发送
    JButton sysMessageButton;//服务端消息的发送按钮
    UserLinkList userLinkList;//用户链表
 
    //建立菜单栏
    JMenuBar jMenuBar = new JMenuBar();
    //建立菜单组
    JMenu serviceMenu = new JMenu ("服务(V)");
    //建立菜单项
    JMenuItem portItem = new JMenuItem ("端口设置(P)");
    JMenuItem startItem = new JMenuItem ("启动服务(S)");
    JMenuItem stopItem=new JMenuItem ("停止服务(T)");
    JMenuItem exitItem=new JMenuItem ("退出(X)");
     
    JMenu helpMenu=new JMenu ("帮助(H)");
    JMenuItem helpItem=new JMenuItem ("帮助(H)");
 
    //建立工具栏
    JToolBar toolBar = new JToolBar();
 
    //建立工具栏中的按钮组件
    JButton portSet;//启动服务端侦听
    JButton startServer;//启动服务端侦听
    JButton stopServer;//关闭服务端侦听
    JButton exitButton;//退出按钮
     
    //框架的大小
    Dimension faceSize = new Dimension(400, 600);
     
    ServerListen listenThread;
 
    JPanel downPanel ;
    GridBagLayout girdBag;
    GridBagConstraints girdBagCon;
 
 
    /**
     * 服务端构造函数
     */
    public ChatServer(){
        init();//初始化程序
 
        //添加框架的关闭事件处理
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        //设置框架的大小
        this.setSize(faceSize);
 
        //设置运行时窗口的位置
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation( (int) (screenSize.width - faceSize.getWidth()) / 2,
                         (int) (screenSize.height - faceSize.getHeight()) / 2);
        this.setResizable(false);
 
        this.setTitle("聊天室服务端"); //设置标题
 
        //程序图标
        icon = getImage("icon.gif");
        this.setIconImage(icon); //设置程序图标
        show();
 
        //为服务菜单栏设置热键'V'
        serviceMenu.setMnemonic('V');
 
        //为端口设置快捷键为ctrl+p
        portItem.setMnemonic ('P');
        portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK));
 
        //为启动服务快捷键为ctrl+s
        startItem.setMnemonic ('S');
        startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK));
 
        //为端口设置快捷键为ctrl+T
        stopItem.setMnemonic ('T');
        stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK));
 
        //为退出设置快捷键为ctrl+x
        exitItem.setMnemonic ('X');
        exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK));
 
        //为帮助菜单栏设置热键'H'
        helpMenu.setMnemonic('H');
 
        //为帮助设置快捷键为ctrl+p
        helpItem.setMnemonic ('H');
        helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK));
 
    }
     
    /**
     * 程序初始化函数
     */
    public void init(){
 
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
 
        //添加菜单栏
        serviceMenu.add (portItem);
        serviceMenu.add (startItem);
        serviceMenu.add (stopItem);
        serviceMenu.add (exitItem);
        jMenuBar.add (serviceMenu);
        helpMenu.add (helpItem);
        jMenuBar.add (helpMenu);
        setJMenuBar (jMenuBar);
 
        //初始化按钮
        portSet = new JButton("端口设置");
        startServer = new JButton("启动服务");
        stopServer = new JButton("停止服务" );
        exitButton = new JButton("退出" );
        //将按钮添加到工具栏
        toolBar.add(portSet);
        toolBar.addSeparator();//添加分隔栏
        toolBar.add(startServer);
        toolBar.add(stopServer);
        toolBar.addSeparator();//添加分隔栏
        toolBar.add(exitButton);
        contentPane.add(toolBar,BorderLayout.NORTH);
 
        //初始时,令停止服务按钮不可用
        stopServer.setEnabled(false);
        stopItem .setEnabled(false);
 
        //为菜单栏添加事件监听
        portItem.addActionListener(this);
        startItem.addActionListener(this);
        stopItem.addActionListener(this);
        exitItem.addActionListener(this);
        helpItem.addActionListener(this);
         
        //添加按钮的事件侦听
        portSet.addActionListener(this);
        startServer.addActionListener(this);
        stopServer.addActionListener(this);
        exitButton.addActionListener(this);
         
        combobox = new JComboBox();
        combobox.insertItemAt("所有人",0);
        combobox.setSelectedIndex(0);
         
        messageShow = new JTextArea();
        messageShow.setEditable(false);
        //添加滚动条
        messageScrollPane = new JScrollPane(messageShow,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        messageScrollPane.setPreferredSize(new Dimension(400,400));
        messageScrollPane.revalidate();
         
        showStatus = new JTextField(35);
        showStatus.setEditable(false);
         
        sysMessage = new JTextField(24);
        sysMessage.setEnabled(false);
        sysMessageButton = new JButton();
        sysMessageButton.setText("发送");
 
        //添加系统消息的事件侦听
        sysMessage.addActionListener(this);
        sysMessageButton.addActionListener(this);
 
        sendToLabel = new JLabel("发送至:");
        messageLabel = new JLabel("发送消息:");
        downPanel = new JPanel();
        girdBag = new GridBagLayout();
        downPanel.setLayout(girdBag);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 0;
        girdBagCon.gridy = 0;
        girdBagCon.gridwidth = 3;
        girdBagCon.gridheight = 2;
        girdBagCon.ipadx = 5;
        girdBagCon.ipady = 5;
        JLabel none = new JLabel("    ");
        girdBag.setConstraints(none,girdBagCon);
        downPanel.add(none);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 0;
        girdBagCon.gridy = 2;
        girdBagCon.insets = new Insets(1,0,0,0);
        girdBagCon.ipadx = 5;
        girdBagCon.ipady = 5;
        girdBag.setConstraints(sendToLabel,girdBagCon);
        downPanel.add(sendToLabel);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx =1;
        girdBagCon.gridy = 2;
        girdBagCon.anchor = GridBagConstraints.LINE_START;
        girdBag.setConstraints(combobox,girdBagCon);
        downPanel.add(combobox);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 0;
        girdBagCon.gridy = 3;
        girdBag.setConstraints(messageLabel,girdBagCon);
        downPanel.add(messageLabel);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 1;
        girdBagCon.gridy = 3;
        girdBag.setConstraints(sysMessage,girdBagCon);
        downPanel.add(sysMessage);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 2;
        girdBagCon.gridy = 3;
        girdBag.setConstraints(sysMessageButton,girdBagCon);
        downPanel.add(sysMessageButton);
 
        girdBagCon = new GridBagConstraints();
        girdBagCon.gridx = 0;
        girdBagCon.gridy = 4;
        girdBagCon.gridwidth = 3;
        girdBag.setConstraints(showStatus,girdBagCon);
        downPanel.add(showStatus);
 
        contentPane.add(messageScrollPane,BorderLayout.CENTER);
        contentPane.add(downPanel,BorderLayout.SOUTH);
         
        //关闭程序时的操作
        this.addWindowListener(
            new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    stopService();
                    System.exit(0);
                }
            }
        );
    }
 
    /**
     * 事件处理
     */
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        if (obj == startServer || obj == startItem) { //启动服务端
            startService();
        }
        else if (obj == stopServer || obj == stopItem) { //停止服务端
            int j=JOptionPane.showConfirmDialog(
                this,"真的停止服务吗?","停止服务",
                JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
             
            if (j == JOptionPane.YES_OPTION){
                stopService();
            }
        }
        else if (obj == portSet || obj == portItem) { //端口设置
            //调出端口设置的对话框
            PortConf portConf = new PortConf(this);
            portConf.show();
        }
        else if (obj == exitButton || obj == exitItem) { //退出程序
            int j=JOptionPane.showConfirmDialog(
                this,"真的要退出吗?","退出",
                JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
             
            if (j == JOptionPane.YES_OPTION){
                stopService();
                System.exit(0);
            }
        }
        else if (obj == helpItem) { //菜单栏中的帮助
            //调出帮助对话框
            Help helpDialog = new Help(this);
            helpDialog.show();
        }
        else if (obj == sysMessage || obj == sysMessageButton) { //发送系统消息
            sendSystemMessage();
        }
    }
     
    /**
     * 启动服务端
     */
    public void startService(){
        try{
            serverSocket = new ServerSocket(port,10);
            messageShow.append("服务端已经启动,在"+port+"端口侦听...\n");
             
            startServer.setEnabled(false);
            startItem.setEnabled(false);
            portSet.setEnabled(false);
            portItem.setEnabled(false);
 
            stopServer .setEnabled(true);
            stopItem .setEnabled(true);
            sysMessage.setEnabled(true);
        }
        catch (Exception e){
            //System.out.println(e);
        }
        userLinkList = new UserLinkList();
         
        listenThread = new ServerListen(serverSocket,combobox,
            messageShow,showStatus,userLinkList);
        listenThread.start();
    }
     
    /**
     * 关闭服务端
     */
    public void stopService(){
        try{
            //向所有人发送服务器关闭的消息
            sendStopToAll();
            listenThread.isStop = true;
            serverSocket.close();
             
            int count = userLinkList.getCount();
             
            int i =0;
            while( i < count){
                Node node = userLinkList.findUser(i);
                 
                node.input .close();
                node.output.close();
                node.socket.close();
                 
                i ++;
            }
 
            stopServer .setEnabled(false);
            stopItem .setEnabled(false);
            startServer.setEnabled(true);
            startItem.setEnabled(true);
            portSet.setEnabled(true);
            portItem.setEnabled(true);
            sysMessage.setEnabled(false);
 
            messageShow.append("服务端已经关闭\n");
 
            combobox.removeAllItems();
            combobox.addItem("所有人");
        }
        catch(Exception e){
            //System.out.println(e);
        }
    }
     
    /**
     * 向所有人发送服务器关闭的消息
     */
    public void sendStopToAll(){
        int count = userLinkList.getCount();
         
        int i = 0;
        while(i < count){
            Node node = userLinkList.findUser(i);
            if(node == null) {
                i ++;
                continue;
            }
             
            try{
                node.output.writeObject("服务关闭");
                node.output.flush();
            }
            catch (Exception e){
                //System.out.println("$$$"+e);
            }
             
            i++;
        }
    }
     
    /**
     * 向所有人发送消息
     */
    public void sendMsgToAll(String msg){
        int count = userLinkList.getCount();//用户总数
         
        int i = 0;
        while(i < count){
            Node node = userLinkList.findUser(i);
            if(node == null) {
                i ++;
                continue;
            }
             
            try{
                node.output.writeObject("系统信息");
                node.output.flush();
                node.output.writeObject(msg);
                node.output.flush();
            }
            catch (Exception e){
                //System.out.println("@@@"+e);
            }
             
            i++;
        }
 
        sysMessage.setText("");
    }
 
    /**
     * 向客户端用户发送消息
     */
    public void sendSystemMessage(){
        String toSomebody = combobox.getSelectedItem().toString();
        String message = sysMessage.getText() + "\n";
         
        messageShow.append(message);
         
        //向所有人发送消息
        if(toSomebody.equalsIgnoreCase("所有人")){
            sendMsgToAll(message);
        }
        else{
            //向某个用户发送消息
            Node node = userLinkList.findUser(toSomebody);
             
            try{
                node.output.writeObject("系统信息");
                node.output.flush();
                node.output.writeObject(message);
                node.output.flush();
            }
            catch(Exception e){
                //System.out.println("!!!"+e);
            }
            sysMessage.setText("");//将发送消息栏的消息清空
        }
    }
 
    /**
     * 通过给定的文件名获得图像
     */
    Image getImage(String filename) {
        URLClassLoader urlLoader = (URLClassLoader)this.getClass().
            getClassLoader();
        URL url = null;
        Image image = null;
        url = urlLoader.findResource(filename);
        image = Toolkit.getDefaultToolkit().getImage(url);
        MediaTracker mediatracker = new MediaTracker(this);
        try {
            mediatracker.addImage(image, 0);
            mediatracker.waitForID(0);
        }
        catch (InterruptedException _ex) {
            image = null;
        }
        if (mediatracker.isErrorID(0)) {
            image = null;
        }
 
        return image;
    }
 
    public static void main(String[] args) {
        ChatServer app = new ChatServer();
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...