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

📄 server.java

📁 一款聊天工具代码
💻 JAVA
字号:
package day16.homework;
import java.io.*;
import java.net.*;
import java.nio.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.swing.*;

import java.awt.event.*;
import java.awt.*;
public class Server extends JFrame implements ActionListener{
        private JTextArea text;
        private Map<Socket,PrintStream> map;//保存所有的socket和对应的写出流
        private boolean pos;
        public Server(){
                super("F-Chat Server 服务器端窗口");
                map = new HashMap<Socket,PrintStream>();
                this.construct();
                this.setSize(400,550);
                this.setLocation(500,250);
                this.setVisible(true);
        }
        public void construct(){
                text = new JTextArea();
                text.setEditable(false);
                text.setBackground(new Color(200,200,225));
                JScrollPane pane = new JScrollPane(text);
                pane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
                this.add(pane,BorderLayout.CENTER);
                JMenuBar bar = new JMenuBar();
                JMenu menu = new JMenu("Admin");
                String[] s = {"Start","Append Time","Save Chating Record","About","Exit"};
                menu = this.makeMenu(menu, s, this);
                bar.add(menu);
                this.setJMenuBar(bar);
                this.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                                try {
                                        exit();
                                } catch (Exception e1) {
                                        e1.printStackTrace();
                                }
                        }
                });
        }
        //制作菜单的方法
        public JMenu makeMenu(JMenu parent,String[] items,ActionListener target){
                if(parent==null || items.length==0) 
                        return null;
                JMenu menu = parent;
                for(int i=0;i<items.length;i++){
                        JMenuItem item = new JMenuItem(items[i]);
                        menu.add(item);
                        if(target!=null)
                                item.addActionListener(target);
                }
                return menu;
        }
        //开启服务器的线程
        class StartThread extends Thread{
                public void run(){
                        try {
                                int ch = JOptionPane.showConfirmDialog(null, 
                                                "comfirm to start the Server ?",
                                                "comfirm", JOptionPane.YES_NO_OPTION);
                                if(!(ch==JOptionPane.YES_OPTION))
                                        return;
                                //开启服务器
                                text.setText("Server is starting,please wait...... \n");
                                for(int i=0;i<3;i++){
                                        text.append(3-i + " seconds left... ... \n");
                                        Thread.sleep(1000);
                                }
                                ServerSocket ss = new ServerSocket(2000);
                                text.append("Server started successfully!! \n");
                                pos = true;//表明服务器运行了
                                for(;;){
                                        Socket s = ss.accept();
                                        PrintStream ps = new PrintStream(s.getOutputStream());
                                        text.append("initiating new Socket Server Thread! \n");
                                        map.put(s,ps);//把这个socket和它的输出流放进map里
                                        new ServerThread(s).start();//分配每个socket用户一个线程
                                        text.append("new socket : \n"+s+"at : \n");
                                        appendTime();
                                        text.append("initiating successfully \n");
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
        }
    //服务聊天的线程
        class ServerThread extends Thread{
                private Socket so;
                public ServerThread(Socket so){
                        this.so = so;
                }
                public void resetPosition(JTextArea text){//让垂直滚动条在最下面
                        int pos = text.getText().length();
                        text.setSelectionStart(pos);
                        text.setSelectionEnd(pos);
                }
                public void run(){
                        try {
                                BufferedReader br = new BufferedReader(new
                                                InputStreamReader(so.getInputStream()));
                                PrintStream ps = new PrintStream(so.getOutputStream());
                                for(;;){
//                                        Thread.sleep(1000);
                                        String temp = br.readLine();
                                        System.out.println(temp);
                                        if(temp==null){
                                                text.append("user"+so.toString()+" leaves at: \n");
                                                appendTime();
                                                br.close();
                                                ps.close();
                                                so.close();
                                                break;
                                        }
                                        text.append(temp+"\n");
                                        this.resetPosition(text);//让垂直滚动条在最下面
                                        this.trans(temp.trim());//把信息传输
                                }
                        } catch (Exception e) {
                                e.printStackTrace();
                        } finally{//发生异常与否都要关闭socket,把so从set中除去
                                try {
                                        map.get(so).close();//把这个socket的ps流关闭
                                        so.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }//客户端退出,关闭socket
                                map.remove(so);//把so从set中除去
                        }
                }
                public void trans(String t){
                        Set<Socket> set = map.keySet();
                        for(Socket s:set){
                                PrintStream ps = map.get(s);
                                ps.println(t);
                        }
                }
        }
        public void save(){
                appendTime();//给聊天记录添加时间
                File file=null;
                JFileChooser chooser = new JFileChooser();
                chooser.showSaveDialog(this);
                file = chooser.getSelectedFile();
                if(file==null){
                        JOptionPane.showConfirmDialog(null, "NOT saved!!");
                        return;
                }
                try{
                        FileWriter writer = new FileWriter(file);
                        writer.write(text.getText());
                        writer.close();//关闭流
                }catch(IOException e){
                                e.printStackTrace();
                }
        }
        public void appendTime(){
                Date date = new GregorianCalendar().getTime();
                text.append(date+"\n");//给聊天记录添加时间
        }
        public void exit(){
                if(text.getText().length()>5 && JOptionPane.showConfirmDialog(null, "是否保存聊天记录")==JOptionPane.YES_OPTION)
                        save();
                System.exit(0);
        }
        public void actionPerformed(ActionEvent e) {
                String temp = e.getActionCommand();
                if("Start".equals(temp)){
                        if(pos){
                                JOptionPane.showConfirmDialog(null, "Server is RUNNING");
                                return;
                        }
                        new StartThread().start();
                        return;
                }        
                if("About".equals(temp)){
                        new About();
                        return;
                }
                if("Save Chating Record".equals(temp)){
                        save();
                        return;
                }
                if("Append Time".equals(temp)){
                        appendTime();
                        return;
                }
                if("Exit".equals(temp)){
                        exit();
                }
        }
        private class About extends JFrame{
                public About(){
                        super("关于F-Chat");
                        this.setLayout(new GridLayout(2,1));
                        this.add(new JLabel("作者:zyh0532@126.com tarena sd_sd080126"));
                        this.add(new JLabel("3.29.2008 19:00 Verson: 1.2"));
                        this.setSize(400,200);
                        this.setLocation(250,150);
                        this.setVisible(true);
                }
        }
        public static void main(String[] args) {
                new Server();
        }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -