diff --git a/CatBean.java b/CatBean.java new file mode 100644 index 0000000..0776c53 --- /dev/null +++ b/CatBean.java @@ -0,0 +1,120 @@ +package cat.function; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.HashSet; + +public class CatBean implements Serializable { + private int type; // 1私聊 0上下线更新 -1下线请求 2请求发送文件 3.确定接收文件 + + private HashSet clients; // 存放选中的客户 + + private HashSet to; + + public HashMap onlines; + + private String info; + + private String timer; + + private String name; + + private String fileName; + + private int size; + + private String ip; + + private int port; + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public HashSet getTo() { + return to; + } + + public void setTo(HashSet to) { + this.to = to; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public HashSet getClients() { + return clients; + } + + public void setClients(HashSet clients) { + this.clients = clients; + } + + public String getInfo() { + return info; + } + + public void setInfo(String info) { + this.info = info; + } + + public String getTimer() { + return timer; + } + + public void setTimer(String timer) { + this.timer = timer; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public HashMap getOnlines() { + return onlines; + } + + public void setOnlines(HashMap onlines) { + this.onlines = onlines; + } + + + +} diff --git a/CatChatroom.java b/CatChatroom.java new file mode 100644 index 0000000..4c94294 --- /dev/null +++ b/CatChatroom.java @@ -0,0 +1,682 @@ +package cat.client; + +import java.applet.Applet; +import java.applet.AudioClip; +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import javax.swing.AbstractListModel; +import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.ListCellRenderer; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import cat.function.CatBean; +import cat.util.CatUtil; + +class CellRenderer extends JLabel implements ListCellRenderer { + CellRenderer() { + setOpaque(true); + } + + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + + setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 加入宽度为5的空白边框 + + if (value != null) { + setText(value.toString()); + setIcon(new ImageIcon("images//1.jpg")); + } + if (isSelected) { + setBackground(new Color(255, 255, 153));// 设置背景色 + setForeground(Color.black); + } else { + // 设置选取与取消选取的前景与背景颜色. + setBackground(Color.white); // 设置背景色 + setForeground(Color.black); + } + setEnabled(list.isEnabled()); + setFont(new Font("sdf", Font.ROMAN_BASELINE, 13)); + setOpaque(true); + return this; + } +} + + +class UUListModel extends AbstractListModel{ + + private Vector vs; + + public UUListModel(Vector vs){ + this.vs = vs; + } + + @Override + public Object getElementAt(int index) { + // TODO Auto-generated method stub + return vs.get(index); + } + + @Override + public int getSize() { + // TODO Auto-generated method stub + return vs.size(); + } + +} + + +public class CatChatroom extends JFrame { + + private static final long serialVersionUID = 6129126482250125466L; + + private static JPanel contentPane; + private static Socket clientSocket; + private static ObjectOutputStream oos; + private static ObjectInputStream ois; + private static String name; + private static JTextArea textArea; + private static AbstractListModel listmodel; + private static JList list; + private static String filePath; + private static JLabel lblNewLabel; + private static JProgressBar progressBar; + private static Vector onlines; + private static boolean isSendFile = false; + private static boolean isReceiveFile = false; + + // 声音 + private static File file, file2; + private static URL cb, cb2; + private static AudioClip aau, aau2; + + /** + * Create the frame. + */ + + public CatChatroom(String u_name, Socket client) { + // 赋值 + name = u_name; + clientSocket = client; + onlines = new Vector(); + + SwingUtilities.updateComponentTreeUI(this); + + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (ClassNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (InstantiationException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalAccessException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (UnsupportedLookAndFeelException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + + + setTitle(name); + setResizable(false); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + setBounds(200, 100, 688, 510); + contentPane = new JPanel() { + private static final long serialVersionUID = 1L; + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(new ImageIcon("images\\聊天室1.jpg").getImage(), 0, 0, + getWidth(), getHeight(), null); + } + + }; + setContentPane(contentPane); + contentPane.setLayout(null); + + // 聊天信息显示区域 + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setBounds(10, 10, 410, 300); + getContentPane().add(scrollPane); + + textArea = new JTextArea(); + textArea.setEditable(false); + textArea.setLineWrap(true);//激活自动换行功能 + textArea.setWrapStyleWord(true);//激活断行不断字功能 + textArea.setFont(new Font("sdf", Font.BOLD, 13)); + scrollPane.setViewportView(textArea); + + // 打字区域 + JScrollPane scrollPane_1 = new JScrollPane(); + scrollPane_1.setBounds(10, 347, 411, 97); + getContentPane().add(scrollPane_1); + + final JTextArea textArea_1 = new JTextArea(); + textArea_1.setLineWrap(true);//激活自动换行功能 + textArea_1.setWrapStyleWord(true);//激活断行不断字功能 + scrollPane_1.setViewportView(textArea_1); + + // 关闭按钮 + final JButton btnNewButton = new JButton("\u5173\u95ED"); + btnNewButton.setBounds(214, 448, 60, 30); + getContentPane().add(btnNewButton); + + // 发送按钮 + JButton btnNewButton_1 = new JButton("\u53D1\u9001"); + btnNewButton_1.setBounds(313, 448, 60, 30); + getRootPane().setDefaultButton(btnNewButton_1); + getContentPane().add(btnNewButton_1); + + // 在线客户列表 + listmodel = new UUListModel(onlines) ; + list = new JList(listmodel); + list.setCellRenderer(new CellRenderer()); + list.setOpaque(false); + Border etch = BorderFactory.createEtchedBorder(); + list.setBorder(BorderFactory.createTitledBorder(etch, "<"+u_name+">" + + "在线客户:", TitledBorder.LEADING, TitledBorder.TOP, new Font( + "sdf", Font.BOLD, 20), Color.green)); + + JScrollPane scrollPane_2 = new JScrollPane(list); + scrollPane_2.setBounds(430, 10, 245, 375); + scrollPane_2.setOpaque(false); + scrollPane_2.getViewport().setOpaque(false); + getContentPane().add(scrollPane_2); + + // 文件传输栏 + progressBar = new JProgressBar(); + progressBar.setBounds(430, 390, 245, 15); + progressBar.setMinimum(1); + progressBar.setMaximum(100); + getContentPane().add(progressBar); + + // 文件传输提示 + lblNewLabel = new JLabel( + "\u6587\u4EF6\u4F20\u9001\u4FE1\u606F\u680F:"); + lblNewLabel.setFont(new Font("SimSun", Font.PLAIN, 12)); + lblNewLabel.setBackground(Color.WHITE); + lblNewLabel.setBounds(430, 410, 245, 15); + getContentPane().add(lblNewLabel); + + try { + oos = new ObjectOutputStream(clientSocket.getOutputStream()); + // 记录上线客户的信息在catbean中,并发送给服务器 + CatBean bean = new CatBean(); + bean.setType(0); + bean.setName(name); + bean.setTimer(CatUtil.getTimer()); + oos.writeObject(bean); + oos.flush(); + + // 消息提示声音 + file = new File("sounds\\呃欧.wav"); + cb = file.toURL(); + aau = Applet.newAudioClip(cb); + // 上线提示声音 + file2 = new File("sounds\\叮.wav"); + cb2 = file2.toURL(); + aau2 = Applet.newAudioClip(cb2); + + // 启动客户接收线程 + new ClientInputThread().start(); + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // 发送按钮 + btnNewButton_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String info = textArea_1.getText(); + List to = list.getSelectedValuesList(); + + if (to.size() < 1) { + JOptionPane.showMessageDialog(getContentPane(), "请选择聊天对象"); + return; + } + if (to.toString().contains(name+"(我)")) { + JOptionPane + .showMessageDialog(getContentPane(), "不能向自己发送信息"); + return; + } + if (info.equals("")) { + JOptionPane.showMessageDialog(getContentPane(), "不能发送空信息"); + return; + } + + CatBean clientBean = new CatBean(); + clientBean.setType(1); + clientBean.setName(name); + String time = CatUtil.getTimer(); + clientBean.setTimer(time); + clientBean.setInfo(info); + HashSet set = new HashSet(); + set.addAll(to); + clientBean.setClients(set); + + // 自己发的内容也要现实在自己的屏幕上面 + textArea.append(time + " 我对" + to + "说:\r\n" + info + "\r\n"); + + sendMessage(clientBean); + textArea_1.setText(null); + textArea_1.requestFocus(); + } + }); + + // 关闭按钮 + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(isSendFile || isReceiveFile){ + JOptionPane.showMessageDialog(contentPane, + "正在传输文件中,您不能离开...", + "Error Message", JOptionPane.ERROR_MESSAGE); + }else{ + btnNewButton.setEnabled(false); + CatBean clientBean = new CatBean(); + clientBean.setType(-1); + clientBean.setName(name); + clientBean.setTimer(CatUtil.getTimer()); + sendMessage(clientBean); + } + } + }); + + // 离开 + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + // TODO Auto-generated method stub + if(isSendFile || isReceiveFile){ + JOptionPane.showMessageDialog(contentPane, + "正在传输文件中,您不能离开...", + "Error Message", JOptionPane.ERROR_MESSAGE); + }else{ + int result = JOptionPane.showConfirmDialog(getContentPane(), + "您确定要离开聊天室"); + if (result == 0) { + CatBean clientBean = new CatBean(); + clientBean.setType(-1); + clientBean.setName(name); + clientBean.setTimer(CatUtil.getTimer()); + sendMessage(clientBean); + } + } + } + }); + + // 列表监听 + list.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + List to = list.getSelectedValuesList(); + if (e.getClickCount() == 2) { + + if (to.toString().contains(name+"(我)")) { + JOptionPane + .showMessageDialog(getContentPane(), "不能向自己发送文件"); + return; + } + + // 双击打开文件文件选择框 + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle("选择文件框"); // 标题哦... + chooser.showDialog(getContentPane(), "选择"); // 这是按钮的名字.. + + // 判定是否选择了文件 + if (chooser.getSelectedFile() != null) { + // 获取路径 + filePath = chooser.getSelectedFile().getPath(); + File file = new File(filePath); + // 文件为空 + if (file.length() == 0) { + JOptionPane.showMessageDialog(getContentPane(), + filePath + "文件为空,不允许发送."); + return; + } + + CatBean clientBean = new CatBean(); + clientBean.setType(2);// 请求发送文件 + clientBean.setSize(new Long(file.length()).intValue()); + clientBean.setName(name); + clientBean.setTimer(CatUtil.getTimer()); + clientBean.setFileName(file.getName()); // 记录文件的名称 + clientBean.setInfo("请求发送文件"); + + // 判断要发送给谁 + HashSet set = new HashSet(); + set.addAll(list.getSelectedValuesList()); + clientBean.setClients(set); + sendMessage(clientBean); + } + } + } + }); + + } + + class ClientInputThread extends Thread { + + @Override + public void run() { + try { + // 不停的从服务器接收信息 + while (true) { + ois = new ObjectInputStream(clientSocket.getInputStream()); + final CatBean bean = (CatBean) ois.readObject(); + switch (bean.getType()) { + case 0: { + // 更新列表 + onlines.clear(); + HashSet clients = bean.getClients(); + Iterator it = clients.iterator(); + while (it.hasNext()) { + String ele = it.next(); + if (name.equals(ele)) { + onlines.add(ele + "(我)"); + } else { + onlines.add(ele); + } + } + + listmodel = new UUListModel(onlines); + list.setModel(listmodel); + aau2.play(); + textArea.append(bean.getInfo() + "\r\n"); + textArea.selectAll(); + break; + } + case -1: { + + return; + } + case 1: { + + String info = bean.getTimer() + " " + bean.getName() + + " 对 " + bean.getClients() + "说:\r\n"; + if (info.contains(name) ) { + info = info.replace(name, "我"); + } + aau.play(); + textArea.append(info+bean.getInfo() + "\r\n"); + textArea.selectAll(); + break; + } + case 2: { + // 由于等待目标客户确认是否接收文件是个阻塞状态,所以这里用线程处理 + new Thread(){ + public void run() { + //显示是否接收文件对话框 + int result = JOptionPane.showConfirmDialog( + getContentPane(), bean.getInfo()); + switch(result){ + case 0:{ //接收文件 + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle("保存文件框"); // 标题哦... + //默认文件名称还有放在当前目录下 + chooser.setSelectedFile(new File(bean + .getFileName())); + chooser.showDialog(getContentPane(), "保存"); // 这是按钮的名字.. + //保存路径 + String saveFilePath =chooser.getSelectedFile().toString(); + + //创建客户CatBean + CatBean clientBean = new CatBean(); + clientBean.setType(3); + clientBean.setName(name); //接收文件的客户名字 + clientBean.setTimer(CatUtil.getTimer()); + clientBean.setFileName(saveFilePath); + clientBean.setInfo("确定接收文件"); + + // 判断要发送给谁 + HashSet set = new HashSet(); + set.add(bean.getName()); + clientBean.setClients(set); //文件来源 + clientBean.setTo(bean.getClients());//给这些客户发送文件 + + + + // 创建新的tcp socket 接收数据, 这是额外增加的功能, 大家请留意... + try { + ServerSocket ss = new ServerSocket(0); // 0可以获取空闲的端口号 + + clientBean.setIp(clientSocket.getInetAddress().getHostAddress()); + clientBean.setPort(ss.getLocalPort()); + sendMessage(clientBean); // 先通过服务器告诉发送方, 你可以直接发送文件到我这里了... + + + + isReceiveFile=true; + //等待文件来源的客户,输送文件....目标客户从网络上读取文件,并写在本地上 + Socket sk = ss.accept(); + textArea.append(CatUtil.getTimer() + " " + bean.getFileName() + + "文件保存中.\r\n"); + DataInputStream dis = new DataInputStream( //从网络上读取文件 + new BufferedInputStream(sk.getInputStream())); + DataOutputStream dos = new DataOutputStream( //写在本地上 + new BufferedOutputStream(new FileOutputStream( + saveFilePath))); + + int count = 0; + int num = bean.getSize() / 100; + int index = 0; + while (count < bean.getSize()) { + int t = dis.read(); + dos.write(t); + count++; + + if(num>0){ + if (count % num == 0 && index < 100) { + progressBar.setValue(++index); + } + lblNewLabel.setText("下载进度:" + count + + "/" + bean.getSize() + " 整体" + index + + "%"); + }else{ + lblNewLabel.setText("下载进度:" + count + + "/" + bean.getSize() +" 整体:"+new Double(new Double(count).doubleValue()/new Double(bean.getSize()).doubleValue()*100).intValue()+"%"); + if(count==bean.getSize()){ + progressBar.setValue(100); + } + } + + } + + //给文件来源客户发条提示,文件保存完毕 + PrintWriter out = new PrintWriter(sk.getOutputStream(),true); + out.println(CatUtil.getTimer() + " 发送给"+name+"的文件[" + bean.getFileName()+"]" + + "文件保存完毕.\r\n"); + out.flush(); + dos.flush(); + dos.close(); + out.close(); + dis.close(); + sk.close(); + ss.close(); + textArea.append(CatUtil.getTimer() + " " + bean.getFileName() + + "文件保存完毕.存放位置为:"+saveFilePath+"\r\n"); + isReceiveFile = false; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + break; + } + default: { + CatBean clientBean = new CatBean(); + clientBean.setType(4); + clientBean.setName(name); //接收文件的客户名字 + clientBean.setTimer(CatUtil.getTimer()); + clientBean.setFileName(bean.getFileName()); + clientBean.setInfo(CatUtil.getTimer() + " " + + name + "取消接收文件[" + + bean.getFileName() + "]"); + + + // 判断要发送给谁 + HashSet set = new HashSet(); + set.add(bean.getName()); + clientBean.setClients(set); //文件来源 + clientBean.setTo(bean.getClients());//给这些客户发送文件 + + sendMessage(clientBean); + + break; + + } + } + }; + }.start(); + break; + } + case 3: { //目标客户愿意接收文件,源客户开始读取本地文件并发送到网络上 + textArea.append(bean.getTimer() + " "+ bean.getName() + "确定接收文件" + ",文件传送中..\r\n"); + new Thread(){ + public void run() { + + try { + isSendFile = true; + //创建要接收文件的客户套接字 + Socket s = new Socket(bean.getIp(),bean.getPort()); + DataInputStream dis = new DataInputStream( + new FileInputStream(filePath)); //本地读取该客户刚才选中的文件 + DataOutputStream dos = new DataOutputStream( + new BufferedOutputStream(s + .getOutputStream())); //网络写出文件 + + + int size = dis.available(); + + int count = 0; //读取次数 + int num = size / 100; + int index = 0; + while (count < size) { + + int t = dis.read(); + dos.write(t); + count++; //每次只读取一个字节 + + if(num>0){ + if (count % num == 0 && index < 100) { + progressBar.setValue(++index); + + } + lblNewLabel.setText("上传进度:" + count + "/" + + size + " 整体" + index + + "%"); + }else{ + lblNewLabel.setText("上传进度:" + count + "/" + + size +" 整体:"+new Double(new Double(count).doubleValue()/new Double(size).doubleValue()*100).intValue()+"%" + ); + if(count==size){ + progressBar.setValue(100); + } + } + } + dos.flush(); + dis.close(); + //读取目标客户的提示保存完毕的信息... + BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); + textArea.append( br.readLine() + "\r\n"); + isSendFile = false; + br.close(); + s.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + + }; + }.start(); + break; + } + case 4: { + textArea.append(bean.getInfo() + "\r\n"); + break; + } + default: { + break; + } + } + + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + if (clientSocket != null) { + try { + clientSocket.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + System.exit(0); + } + } + } + + private void sendMessage(CatBean clientBean) { + try { + oos = new ObjectOutputStream(clientSocket.getOutputStream()); + oos.writeObject(clientBean); + oos.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/CatLogin.java b/CatLogin.java new file mode 100644 index 0000000..055c8ce --- /dev/null +++ b/CatLogin.java @@ -0,0 +1,178 @@ +package cat.login; + +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Properties; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.border.EmptyBorder; + +import cat.client.CatChatroom; +import cat.function.CatBean; +import cat.function.ClientBean; +import cat.util.CatUtil; + +public class CatLogin extends JFrame { + + private JPanel contentPane; + private JTextField textField; + private JPasswordField passwordField; + public static HashMap onlines; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + // 启动登陆界面 + CatLogin frame = new CatLogin(); + frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the frame. + */ + public CatLogin() { + setTitle("Landing cat chat room\n"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(350, 250, 450, 300); + contentPane = new JPanel() { + private static final long serialVersionUID = 1L; + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(new ImageIcon( + "images\\\u767B\u9646\u754C\u9762.jpg").getImage(), 0, + 0, getWidth(), getHeight(), null); + } + }; + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + contentPane.setLayout(null); + + textField = new JTextField(); + textField.setBounds(128, 153, 104, 21); + textField.setOpaque(false); + contentPane.add(textField); + textField.setColumns(10); + + passwordField = new JPasswordField(); + passwordField.setForeground(Color.BLACK); + passwordField.setEchoChar('*'); + passwordField.setOpaque(false); + passwordField.setBounds(128, 189, 104, 21); + contentPane.add(passwordField); + + final JButton btnNewButton = new JButton(); + btnNewButton.setIcon(new ImageIcon("images\\\u767B\u9646.jpg")); + btnNewButton.setBounds(246, 227, 50, 25); + getRootPane().setDefaultButton(btnNewButton); + contentPane.add(btnNewButton); + + final JButton btnNewButton_1 = new JButton(); + btnNewButton_1.setIcon(new ImageIcon("images\\\u6CE8\u518C.jpg")); + btnNewButton_1.setBounds(317, 227, 50, 25); + contentPane.add(btnNewButton_1); + + // 提示信息 + final JLabel lblNewLabel = new JLabel(); + lblNewLabel.setBounds(60, 220, 151, 21); + lblNewLabel.setForeground(Color.red); + getContentPane().add(lblNewLabel); + + // 监听登陆按钮 + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Properties userPro = new Properties(); + File file = new File("Users.properties"); + CatUtil.loadPro(userPro, file); + String u_name = textField.getText(); + if (file.length() != 0) { + + if (userPro.containsKey(u_name)) { + String u_pwd = new String(passwordField.getPassword()); + if (u_pwd.equals(userPro.getProperty(u_name))) { + + try { + Socket client = new Socket("localhost", 8520); + + btnNewButton.setEnabled(false); + CatChatroom frame = new CatChatroom(u_name, + client); + frame.setVisible(true);// 显示聊天界面 + setVisible(false);// 隐藏掉登陆界面 + + } catch (UnknownHostException e1) { + // TODO Auto-generated catch block + errorTip("The connection with the server is interrupted, please login again"); + } catch (IOException e1) { + // TODO Auto-generated catch block + errorTip("The connection with the server is interrupted, please login again"); + } + + } else { + lblNewLabel.setText("您输入的密码有误!"); + textField.setText(""); + passwordField.setText(""); + textField.requestFocus(); + } + } else { + lblNewLabel.setText("您输入昵称不存在!"); + textField.setText(""); + passwordField.setText(""); + textField.requestFocus(); + } + } else { + lblNewLabel.setText("您输入昵称不存在!"); + textField.setText(""); + passwordField.setText(""); + textField.requestFocus(); + } + } + }); + + //注册按钮监听 + btnNewButton_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnNewButton_1.setEnabled(false); + CatResign frame = new CatResign(); + frame.setVisible(true);// 显示注册界面 + setVisible(false);// 隐藏掉登陆界面 + } + }); + } + + protected void errorTip(String str) { + // TODO Auto-generated method stub + JOptionPane.showMessageDialog(contentPane, str, "Error Message", + JOptionPane.ERROR_MESSAGE); + textField.setText(""); + passwordField.setText(""); + textField.requestFocus(); + } +} \ No newline at end of file diff --git a/CatResign.java b/CatResign.java new file mode 100644 index 0000000..cdff0ff --- /dev/null +++ b/CatResign.java @@ -0,0 +1,149 @@ +package cat.login; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.border.EmptyBorder; + +import cat.util.CatUtil; + +public class CatResign extends JFrame { + + private JPanel contentPane; + private JTextField textField; + private JPasswordField passwordField; + private JPasswordField passwordField_1; + private JLabel lblNewLabel; + + public CatResign() { + setTitle("Registered cat chat room\n"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(350, 250, 450, 300); + contentPane = new JPanel() { + private static final long serialVersionUID = 1L; + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(new ImageIcon("images\\\u6CE8\u518C\u754C\u9762.jpg").getImage(), 0,0, getWidth(), getHeight(), null); + } + }; + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + contentPane.setLayout(null); + + textField = new JTextField(); + textField.setBounds(150, 42, 104, 21); + textField.setOpaque(false); + contentPane.add(textField); + textField.setColumns(10); + + passwordField = new JPasswordField(); + passwordField.setEchoChar('*'); + passwordField.setOpaque(false); + passwordField.setBounds(190, 98, 104, 21); + contentPane.add(passwordField); + + passwordField_1 = new JPasswordField(); + passwordField_1.setBounds(192, 152, 104, 21); + passwordField_1.setOpaque(false); + contentPane.add(passwordField_1); + + //注册按钮 + final JButton btnNewButton_1 = new JButton(); + btnNewButton_1.setIcon(new ImageIcon("images\\注册1.jpg")); + btnNewButton_1.setBounds(320, 198, 80, 40); + getRootPane().setDefaultButton(btnNewButton_1); + contentPane.add(btnNewButton_1); + + //返回按钮 + final JButton btnNewButton = new JButton(""); + btnNewButton.setIcon(new ImageIcon("images\\返回.jpg")); + btnNewButton.setBounds(230, 198, 80, 40); + contentPane.add(btnNewButton); + + //提示信息 + lblNewLabel = new JLabel(); + lblNewLabel.setBounds(55, 218, 185, 20); + lblNewLabel.setForeground(Color.red); + contentPane.add(lblNewLabel); + + //返回按钮监听 + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + btnNewButton.setEnabled(false); + //返回登陆界面 + CatLogin frame = new CatLogin(); + frame.setVisible(true); + setVisible(false); + } + }); + + //注册按钮监听 + btnNewButton_1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Properties userPro = new Properties(); + File file = new File("Users.properties"); + CatUtil.loadPro(userPro, file); + + String u_name = textField.getText(); + String u_pwd = new String(passwordField.getPassword()); + String u_pwd_ag = new String(passwordField_1.getPassword()); + + // 判断用户名是否在普通用户中已存在 + if (u_name.length() != 0) { + + if (userPro.containsKey(u_name)) { + lblNewLabel.setText("用户名已存在!"); + } else { + isPassword(userPro, file, u_name, u_pwd, u_pwd_ag); + } + } else { + lblNewLabel.setText("用户名不能为空!"); + } + } + + private void isPassword(Properties userPro, + File file, String u_name, String u_pwd, String u_pwd_ag) { + if (u_pwd.equals(u_pwd_ag)) { + if (u_pwd.length() != 0) { + userPro.setProperty(u_name, u_pwd_ag); + try { + userPro.store(new FileOutputStream(file), + "Copyright (c) Boxcode Studio"); + } catch (FileNotFoundException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + btnNewButton_1.setEnabled(false); + //返回登陆界面 + CatLogin frame = new CatLogin(); + frame.setVisible(true); + setVisible(false); + } else { + lblNewLabel.setText("密码为空!"); + } + } else { + lblNewLabel.setText("密码不一致!"); + } + } + }); + } +} diff --git a/CatServer.java b/CatServer.java new file mode 100644 index 0000000..6d450eb --- /dev/null +++ b/CatServer.java @@ -0,0 +1,268 @@ +package cat.server; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + + +import cat.function.CatBean; +import cat.function.ClientBean; + +public class CatServer { + private static ServerSocket ss; + public static HashMap onlines; + static { + try { + ss = new ServerSocket(8520); + onlines = new HashMap(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + class CatClientThread extends Thread { + private Socket client; + private CatBean bean; + private ObjectInputStream ois; + private ObjectOutputStream oos; + + public CatClientThread(Socket client) { + this.client = client; + } + + @Override + public void run() { + try { + // 不停的从客户端接收信息 + while (true) { + // 读取从客户端接收到的catbean信息 + ois = new ObjectInputStream(client.getInputStream()); + bean = (CatBean)ois.readObject(); + + // 分析catbean中,type是那样一种类型 + switch (bean.getType()) { + // 上下线更新 + case 0: { // 上线 + // 记录上线客户的用户名和端口在clientbean中 + ClientBean cbean = new ClientBean(); + cbean.setName(bean.getName()); + cbean.setSocket(client); + // 添加在线用户 + onlines.put(bean.getName(), cbean); + // 创建服务器的catbean,并发送给客户端 + CatBean serverBean = new CatBean(); + serverBean.setType(0); + serverBean.setInfo(bean.getTimer() + " " + + bean.getName() + "上线了"); + // 通知所有客户有人上线 + HashSet set = new HashSet(); + // 客户昵称 + set.addAll(onlines.keySet()); + serverBean.setClients(set); + sendAll(serverBean); + break; + } + case -1: { // 下线 + // 创建服务器的catbean,并发送给客户端 + CatBean serverBean = new CatBean(); + serverBean.setType(-1); + + try { + oos = new ObjectOutputStream( + client.getOutputStream()); + oos.writeObject(serverBean); + oos.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + onlines.remove(bean.getName()); + + // 向剩下的在线用户发送有人离开的通知 + CatBean serverBean2 = new CatBean(); + serverBean2.setInfo(bean.getTimer() + " " + + bean.getName() + " " + " 下线了"); + serverBean2.setType(0); + HashSet set = new HashSet(); + set.addAll(onlines.keySet()); + serverBean2.setClients(set); + + sendAll(serverBean2); + return; + } + case 1: { // 聊天 + +// 创建服务器的catbean,并发送给客户端 + CatBean serverBean = new CatBean(); + + serverBean.setType(1); + serverBean.setClients(bean.getClients()); + serverBean.setInfo(bean.getInfo()); + serverBean.setName(bean.getName()); + serverBean.setTimer(bean.getTimer()); + // 向选中的客户发送数据 + sendMessage(serverBean); + break; + } + case 2: { // 请求接受文件 + // 创建服务器的catbean,并发送给客户端 + CatBean serverBean = new CatBean(); + String info = bean.getTimer() + " " + bean.getName() + + "向你传送文件,是否需要接受"; + + serverBean.setType(2); + serverBean.setClients(bean.getClients()); // 这是发送的目的地 + serverBean.setFileName(bean.getFileName()); // 文件名称 + serverBean.setSize(bean.getSize()); // 文件大小 + serverBean.setInfo(info); + serverBean.setName(bean.getName()); // 来源 + serverBean.setTimer(bean.getTimer()); + // 向选中的客户发送数据 + sendMessage(serverBean); + + break; + } + case 3: { // 确定接收文件 + CatBean serverBean = new CatBean(); + + serverBean.setType(3); + serverBean.setClients(bean.getClients()); // 文件来源 + serverBean.setTo(bean.getTo()); // 文件目的地 + serverBean.setFileName(bean.getFileName()); // 文件名称 + serverBean.setIp(bean.getIp()); + serverBean.setPort(bean.getPort()); + serverBean.setName(bean.getName()); // 接收的客户名称 + serverBean.setTimer(bean.getTimer()); + // 通知文件来源的客户,对方确定接收文件 + sendMessage(serverBean); + break; + } + case 4: { + CatBean serverBean = new CatBean(); + + serverBean.setType(4); + serverBean.setClients(bean.getClients()); // 文件来源 + serverBean.setTo(bean.getTo()); // 文件目的地 + serverBean.setFileName(bean.getFileName()); + serverBean.setInfo(bean.getInfo()); + serverBean.setName(bean.getName());// 接收的客户名称 + serverBean.setTimer(bean.getTimer()); + sendMessage(serverBean); + + break; + } + default: { + break; + } + } + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + close(); + } + } + + // 向选中的用户发送数据 + private void sendMessage(CatBean serverBean) { + // 首先取得所有的values + Set cbs = onlines.keySet(); + Iterator it = cbs.iterator(); + // 选中客户 + HashSet clients = serverBean.getClients(); + while (it.hasNext()) { + // 在线客户 + String client = it.next(); + // 选中的客户中若是在线的,就发送serverbean + if (clients.contains(client)) { + Socket c = onlines.get(client).getSocket(); + ObjectOutputStream oos; + try { + oos = new ObjectOutputStream(c.getOutputStream()); + oos.writeObject(serverBean); + oos.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + } + + // 向所有的用户发送数据 + public void sendAll(CatBean serverBean) { + Collection clients = onlines.values(); + Iterator it = clients.iterator(); + ObjectOutputStream oos; + while (it.hasNext()) { + Socket c = it.next().getSocket(); + try { + oos = new ObjectOutputStream(c.getOutputStream()); + oos.writeObject(serverBean); + oos.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + private void close() { + if (oos != null) { + try { + oos.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (ois != null) { + try { + ois.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (client != null) { + try { + client.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + public void start() { + try { + while (true) { + Socket client = ss.accept(); + new CatClientThread(client).start(); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static void main(String[] args) { + new CatServer().start(); + } + +} diff --git a/CatUtil.java b/CatUtil.java new file mode 100644 index 0000000..2eeab23 --- /dev/null +++ b/CatUtil.java @@ -0,0 +1,40 @@ +package cat.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +public class CatUtil { + + // Properties加载文件信息 + public static void loadPro(Properties pro, File file) { + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + try { + pro.load(new FileInputStream(file)); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @SuppressWarnings("unused") + public static String getTimer() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(new Date()); + } + +} diff --git a/Client.java b/Client.java index 2490d7b..0d83ccc 100644 --- a/Client.java +++ b/Client.java @@ -1,34 +1,27 @@ -package com.client; - -import java.awt.image.BufferedImage; -import java.net.Socket; - -import javax.imageio.ImageIO; - -public class Client { - public static void main(String[] args) throws Exception { - - Socket socket = null; - try { - while (true) { - socket = new Socket("172.24.1.110", 12000); - // 鑾峰彇灞忓箷鐢诲竷 - BufferedImage image = new ShotImage().snapShot(); - /* - * 濡傛灉灞忓箷鐢诲竷鑾峰彇涓嶅埌锛屽垯鎶ュ嚭寮傚父IoException - */ - if (image == null){ - System.out.println("鍥惧儚鑾峰彇涓嶅埌锛"); - break; - } - // 浣跨敤鏀寔缁欏畾鏍煎紡鐨勪换鎰 ImageWriter 灏嗕竴涓浘鍍忓啓鍏 OutputStream銆 - ImageIO.write(image, "jpg", socket.getOutputStream()); - System.out.println("鍐欏嚭鍥惧儚鎴愬姛"); - socket.close(); - } - // new ClientThread(socket).start(); - } catch (Exception ee) { - System.out.println("浣犲凡涓庢湇鍔$鏂紑杩炴帴锛"); - } - } -} +import java.awt.*; +import javax.swing.*; + +public class Client extends JFrame { + private static final long serialVersionUID = 1L; + Dimension screenSize; + + public Client() { + super(); + screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + this.setSize(800, 640); + Screen p = new Screen(); + Container c = this.getContentPane(); + c.setLayout(new BorderLayout()); + c.add(p, SwingConstants.CENTER); + new Thread(p).start(); + SwingUtilities.invokeLater(new Runnable(){ + public void run() { + setVisible(true); + }}); + } + + public static void main(String[] args) { + new Client(); + } +} + \ No newline at end of file diff --git a/ClientBean.java b/ClientBean.java new file mode 100644 index 0000000..7198038 --- /dev/null +++ b/ClientBean.java @@ -0,0 +1,24 @@ +package cat.function; + +import java.net.Socket; + +public class ClientBean { + private String name; + private Socket socket; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Socket getSocket() { + return socket; + } + + public void setSocket(Socket socket) { + this.socket = socket; + } +} diff --git a/GenerateDate.java b/GenerateDate.java new file mode 100644 index 0000000..1418706 --- /dev/null +++ b/GenerateDate.java @@ -0,0 +1,20 @@ +package com.server.util; + +import java.util.Date; +import java.text.SimpleDateFormat; + +/* + * 日期生成类,包含静态工厂方法 + */ +public class GenerateDate { + + public static String getDate() { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss--->"); + + String date = sdf.format(new Date()); + + return date; + + } +} diff --git a/GetFileInputStream.java b/GetFileInputStream.java new file mode 100644 index 0000000..d0177d2 --- /dev/null +++ b/GetFileInputStream.java @@ -0,0 +1,31 @@ +package com.server.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; + +public class GetFileInputStream { + + public static String fileName; + + public static InputStream getFileInputStream(){ + // 进行文件的读取.数据源 + SendFile open = new SendFile(); + // 获取全文件名(全路径) + fileName = open.getFile(); + // 构造一个File对象 + File myFile = new File(fileName); + // 输入流 + InputStream in = null; + + try { + // 获取文件的输入流 + in = new FileInputStream(myFile); + + } catch (FileNotFoundException e1) { + System.out.println("未选中文件!"); + } + return in; + } +} diff --git a/README.md b/README.md index f90af9e..3af1a7f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # Project -杞欢宸ョ▼绋嬪簭璁捐 +鍩轰簬Java鐨勫疄楠屽鏁欏鐩戞帶绯荤粺寮鍙 diff --git a/Screen.java b/Screen.java new file mode 100644 index 0000000..e8074b8 --- /dev/null +++ b/Screen.java @@ -0,0 +1,65 @@ +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.zip.ZipInputStream; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; + + +class Screen extends JPanel implements Runnable { + + private static final long serialVersionUID = 1L; + private Image cimage; + + public void run() { + ServerSocket ss = null; + try { + ss = new ServerSocket(5001);// 探听5001端口的连接 + while (true) { + Socket s = null; + try { + s = ss.accept(); + ZipInputStream zis = new ZipInputStream(s + .getInputStream()); + zis.getNextEntry(); + cimage = ImageIO.read(zis);// 把ZIP流转换为图片 + repaint(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (s != null) { + try { + s.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } catch (Exception e) { + } finally { + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public Screen() { + super(); + this.setLayout(null); + } + + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2 = (Graphics2D) g; + g2.drawImage(cimage, 0, 0, null); + } + } diff --git a/SendFile.java b/SendFile.java new file mode 100644 index 0000000..9607566 --- /dev/null +++ b/SendFile.java @@ -0,0 +1,38 @@ +package com.server.util; + +import java.awt.FileDialog; + +import javax.swing.JFrame; + +public class SendFile extends JFrame{ + + public static String name = null; + + private static final long serialVersionUID = 1L; + + public static String fileName = null; + + // 选择打开文件 + public String getFile() { + //打开一个FileDialog,设置标题和模式(读取文件) + FileDialog fd = new FileDialog(this, "请选择要传给zpc的文件", FileDialog.LOAD); + + //设置打开对话框的根目录 + fd.setDirectory("C:\\"); + + fd.setVisible(true); + /* + * 当用户选择了取消按钮,则返回null + */ + if (fd.getFile() != null) { + //获取文件的全文件名 + fileName = fd.getDirectory()+fd.getFile(); + + name = fd.getFile(); + + System.out.println("已选择打开 " + fileName); + } + //返回文件全路径 + return fileName; + } +} diff --git a/Server.java b/Server.java index 0de2cc2..bc6033e 100644 --- a/Server.java +++ b/Server.java @@ -1,30 +1,221 @@ -package com.server; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -public class Server { - - public static void main(String[] args) throws Exception { - new Server_Frame(); - // 鍒涘缓涓涓湇鍔″櫒绔疭erverSocket锛岀鍙e彿涓12000 - @SuppressWarnings("resource") - ServerSocket server = new ServerSocket(12000); - // 鏈嶅姟鍣ㄧ鐨凷ocket - Socket socket = null; - /* - * 閲囩敤姝诲惊鐜紝涓嶆柇鐩戝惉鏉ヨ嚜瀹㈡埛绔殑閾炬帴 - */ - while (true) { - try { - // 鐩戝惉瀹㈡埛绔殑杩炴帴 - socket = server.accept(); - // 姣忓緱鍒颁竴涓摼鎺ワ紝鍗曠嫭鍚姩涓涓猅hread绾跨▼澶勭悊璇ラ摼鎺 - new ServerThread(socket).start(); - } catch (IOException ee) { - System.err.println("鏈嶅姟鍣ㄥ凡鍏抽棴锛"); - } - } - } -} +package com.server; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JOptionPane; + +import com.server.control.SendFileThread; +import com.server.util.GetFileInputStream; +import com.server.util.SendFile; +import com.server.util.WriteUserText; + +public class Server { + + public static Map ipMap = Collections.synchronizedMap(new HashMap()); + public static Map ipMap1 = Collections.synchronizedMap(new HashMap()); + /* + * 服务器初始化窗口 + */ + public static Server_Frame sf = null; + /* + * 每个客户机链接对应的Map标识 + */ + public static int flag = 0; + public static int count = 0; + + public static boolean fileFlag = false; + + public static void util(Socket socket, String ip) { + + if (ipMap.containsKey(ip)) { + + flag = ipMap.get(ip);// 取出IP对应的序号 + /* + * 如果监控功能没有开启,我肯定是不放行的,但是链接依旧保存 + */ + ServerThread a = new ServerThread(socket, flag,ip); + System.out.println("1、isAlive" + a.isAlive()); + a.start(); + System.out.println("2、isAlive" + a.isAlive()); + } else { + + ipMap.put(ip, (ipMap.size()) + 1);// 第一台机器对应1 + + flag = ipMap.size();// 第一台机器输出1 + /* + * 开启日志记录线程 + */ + new WriteUserText(ip).start(); + + ServerThread a = new ServerThread(socket, flag,ip); + System.out.println("1、isAlive" + a.isAlive()); + a.start(); + System.out.println("2、isAlive" + a.isAlive()); + } + } + + public static boolean mainListener(ServerSocket server) { + // 服务器端的Socket + Socket socket = null; + try { + socket = server.accept(); + + String ip = socket.getInetAddress().getHostAddress(); + util(socket, ip); + /* + * if (ipMap.size() > 52) { + * + * break;// 应该拒绝链接 } + */ + + // 如果点击了发送文件按钮,则传输图片的功能应该被取消掉 + if (fileFlag/* 按钮被点击 */) { + server.close(); + return false; + } + } catch (IOException e) { + System.out.println("1"); + e.printStackTrace(); + } + return true; + } + + public static void sendFile(ServerSocket server) { + // 此处要循环监听所有客户端 + Socket socket = null; + InputStream in = null; + DataOutputStream os = null; + System.out.println("count=" + count); + System.out.println("size=" + ipMap.size()); + /* + * 暂时还没有解决in为空的情况,即老师取消发送文件 + */ + in = GetFileInputStream.getFileInputStream(); + while (true) { + try { + socket = server.accept(); + /* + * 获取输入流,输出流,告诉客户端我是要发文件 + */ + os = new DataOutputStream(socket.getOutputStream()); + + os.writeUTF("file");//到最后在关闭 + + String ip = socket.getInetAddress().getHostAddress(); + if (ipMap1.containsKey(ip)) { + in = new FileInputStream(new File(SendFile.fileName)); + System.out.println(4122); + SendFileThread b = new SendFileThread(socket, in); + System.out.println(77); + b.start(); + try { + b.join(); + count++; + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(78); + System.out.println("count=" + count); + System.out.println("size=" + ipMap.size()); + } else { + System.out.println(5453); + ipMap1.put(ip, socket); + in = new FileInputStream(new File(SendFile.fileName)); + SendFileThread b = new SendFileThread(socket, in); + + System.out.println(777); + System.out.println(in); + b.start(); + try { + b.join(); + count++; + System.out.println(count); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(7875); + System.out.println("count=" + count); + System.out.println("size=" + ipMap.size()); + } + System.out.println(4552); + } catch (IOException e1) { + System.out.println("233"); + } + + if (ipMap.size() == count) { + System.out.println(12312); + JOptionPane.showMessageDialog(null, "文件发送完成!"); + count = 0; + if (in != null) + try { + in.close(); + } catch (IOException e) { + System.out.println(11); + e.printStackTrace(); + } + if (os != null) + try { + os.close(); + } catch (IOException e) { + System.out.println(11); + e.printStackTrace(); + } + break; + } + } + } + + public static void main(String[] args) { + // 创建一个服务器端ServerSocket,端口号为12000 + ServerSocket server; + try { + sf = new Server_Frame(); + server = new ServerSocket(12000); + /* + * 采用死循环,不断监听来自客户端的链接 + */ + while (true) { + System.out.println(23); + boolean isTrue = mainListener(server); + // 已经关闭 + if (!isTrue) { + System.out.println(1); + server = new ServerSocket(10000); + sendFile(server); + //server.close(); + //因为是本机,所以提示被占用 + fileFlag = false; + server = new ServerSocket(12000); + } + + /* + * if 消息按钮点击了,...... + */ + + /* + * if 远程操控按钮点击了,...... + */ + } + } catch (IOException e) { + System.out.println(12121); + e.printStackTrace(); + } catch (Exception e) { + System.out.println(121); +// try { +// server = new ServerSocket(12000); +// } catch (IOException e1) { +// e1.printStackTrace(); +// } + e.printStackTrace(); + } + } +} diff --git a/ServerThread.java b/ServerThread.java new file mode 100644 index 0000000..faa2ffb --- /dev/null +++ b/ServerThread.java @@ -0,0 +1,96 @@ +package com.server; + +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.net.Socket; + +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; + +import com.server.control.NewWatchFrame; +import com.server.util.GenerateDate; + +public class ServerThread extends Thread { + + public Socket socket; + public int flag; + private String ip; + public ServerThread(Socket socket, int flag,String ip) { + try { + this.socket = socket; + this.flag = flag; + this.ip=ip; + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public synchronized void run() { + + System.out.println(this.getName()); + + try { + + BufferedImage image = ImageIO.read(socket.getInputStream()); + + // 测试 + System.out.println("正在读取图像"); + // 测试 + if (socket.getInputStream() == null) { + System.out.println("输出流为空!"); + } + // 测试 + if (socket == null) { + System.out.println("socket为空1"); + } + // 测试 + if (socket == null) { + System.out.println("socket为空2"); + } + // 测试 + if (image == null) { + System.out.println("图像为空"); + } + // 测试 + if (socket.getInputStream() == null) { + System.out.println("输入流为空!"); + } + // 测试 + System.out.println("成功收到图像"); + if (Server_Frame.isMonitor == true) { + // size数量,往第1个按钮写图片 + Server_Frame.bt[flag - 1] + .setIcon(new ImageIcon(image.getScaledInstance(290, 180, Image.SCALE_AREA_AVERAGING))); + Server_Frame.bt[flag - 1].setText(ip+" "+flag+"号机"); + Server_Frame.bt[flag - 1].setIconTextGap(10); + /* + * 显示查看那个按钮(电脑)的图像 + */ + if (Server_Frame.clickedNum == flag) { + + Server_Frame.bt[flag - 1].setIcon(new ImageIcon(image)); + + NewWatchFrame.label.setIcon(Server_Frame.bt[flag - 1].getIcon()); + /* + * 这里有一个小小的bug,那个如果点击第一个时会出现被放大了 + */ + } + } + + // 测试 + System.out.println("成功写入按钮"); + socket.close(); + System.out.println("3、"+Thread.currentThread().isAlive()); + System.out.println("4、"+socket.isClosed()); + System.out.println("5、"+socket.isConnected());//关闭socket该方法并不会返回false + } catch (Exception e) { + Server.count++; + Server_Frame.getTextArea03().append(GenerateDate.getDate() + flag+"号机已下线"+"\n"); + Server_Frame.getTextArea03().append(GenerateDate.getDate() + Server.count +"\n"); + + + System.out.println("服务器已关闭!"); + } + } +} diff --git a/Server_Frame.java b/Server_Frame.java index 664361a..0e0e113 100644 --- a/Server_Frame.java +++ b/Server_Frame.java @@ -1,167 +1,471 @@ -ackage com.server; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.Toolkit; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.border.EtchedBorder; -import javax.swing.border.TitledBorder; - -public class Server_Frame extends JFrame{ - private static final long serialVersionUID = 1L; - private static JPanel p1=new JPanel(new GridLayout(1, 10)); //瀹氫箟涓涓腑闂村鍣紝瀛樻斁椤堕儴9涓寜閽+1涓爣绛 - private static JButton[] btn = new JButton[13];//涓13涓寜閽坊鍔犳秷鎭彁绀 - private static JLabel label = new JLabel( " 姝ゅ鏄剧ず鏃堕棿"); //鏄剧ず鏃堕棿鐨勬爣绛 - private static JPanel p2 = new JPanel(); - private static Box box = Box.createVerticalBox(); - private static JPanel p3 = new JPanel(new BorderLayout()); - private static JPanel p4 = new JPanel(new BorderLayout());//瀛樼1涓枃鏈 - private static JTextArea textArea01 = new JTextArea(5,40);//瀹氫箟绗2涓紝绗3涓枃鏈 - private static JTextArea textArea02 = new JTextArea(3,6); - private static JTextArea textArea03 = new JTextArea(5,55); - private static Box box01 = Box.createVerticalBox(); - private static Box box02 = Box.createHorizontalBox(); - private static JButton bt01 = new JButton("鍙戦佽嚦鍏ㄤ綋鎴愬憳");//瀹氫箟涓や釜鏀炬寜閽 - private static JButton bt02 = new JButton("鍙戦"); - private static JPanel p5 = new JPanel(); - private static JPanel p6 = new JPanel(new GridLayout()); - private static String[] message = new String[]{ - "瑙嗛褰曞儚","","", - "閿佷綇瀹㈡埛鏈","","", - "","","", - "","","","璁剧疆" - };//璁剧疆鎸夐挳鎻愮ず淇℃伅 - - public static JButton[] bt = new JButton[16]; - //鍒濆鍖栫獥鍙e嚱鏁 - public Server_Frame() { - //璁剧疆绐椾綋鏍囬 - this.setTitle("杩滅▼妗岄潰鐩戞帶绯荤粺"); - //璁剧疆绐椾綋澶у皬 - this.setSize(1331,736); - /* - * 璁剧疆绐楀彛澶勪簬灞忓箷姝d腑闂 - */ - Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); - //鑾峰彇灞忓箷璁惧鐨勫搴 - int width = (int) d.getWidth();//1366 - //鑾峰彇灞忓箷璁惧鐨勯珮搴 - int height = (int) d.getHeight();//768 - //璁剧疆绐椾綋澶勪簬姝d腑闂 - this.setLocation((width-1331)/2, (height-736)/2); - //鍒嗗埆鍒涘缓9涓笂鏍囬鎸夐挳 - for (int i = 0; i <9; i++) { - btn[i] = new JButton(new ImageIcon(this.getClass().getResource("/images/"+i+".png"))); - p1.add(btn[i]); - btn[i].setToolTipText(message[i]); - } - p1.add(label); - p2.setBorder(new TitledBorder(new EtchedBorder(),"鐢ㄦ埛鍒楄〃")); - /* - * 鍒涘缓宸﹁竟鐨4涓寜閽 - */ - for (int i = 9; i < btn.length; i++) { - btn[i] = new JButton(new ImageIcon(this.getClass().getResource("/images/"+i+".png"))); - box.add(Box.createHorizontalStrut(1)); - box.add(btn[i]); - btn[i].setToolTipText(message[i]); - } - p3.add(p2,BorderLayout.CENTER); - p3.add(box,BorderLayout.EAST); - - p4.setBorder(new TitledBorder(new EtchedBorder(),"淇℃伅绠$悊")); - - textArea01.setLineWrap(true); - textArea01.setWrapStyleWord(true); - JScrollPane js_01 = new JScrollPane(textArea01); - - textArea02.setLineWrap(true); - textArea02.setWrapStyleWord(true); - JScrollPane js_02 = new JScrollPane(textArea02); - - box02.add(bt01); - box02.add(Box.createHorizontalStrut(10)); - box02.add(bt02); - - box01.add(js_02); - box01.add(box02); - - /* - * 璁剧疆甯冨眬 - */ - p4.add(js_01,BorderLayout.WEST); - p4.add(box01,BorderLayout.EAST); - - p5.setBorder(new TitledBorder(new EtchedBorder(),"鐢ㄦ埛璁板綍")); - - /* - * 鏂囨湰妗 - */ - //璁剧疆鑷姩鎹㈣銆佽嚜鍔ㄦ崲瀛楀姛鑳 - textArea03.setLineWrap(true); - textArea03.setWrapStyleWord(true); - JScrollPane js_03 = new JScrollPane(textArea03); - - p5.add(js_03); - - //瀛樼p4,p5 - p6.add(p4); - p6.add(p5); - - /* - * 灏嗕笁涓鍣ㄦ坊鍔犲埌JFrame涓 - */ - this.add(p1,BorderLayout.NORTH); - this.add(p3,BorderLayout.CENTER); - this.add(p6,BorderLayout.SOUTH); - - - p2.setLayout(new GridLayout(4, 4)); - - - for (int i = 0; i < bt.length; i++) { - bt[i] = new JButton(new ImageIcon(this.getClass().getResource("/images/"+i+".png"))); - p2.add(bt[i]); - } - - //璁剧疆绐椾綋鏄剧ず鍑烘潵 - this.setVisible(true); - //璁剧疆绐楀彛涓嶈兘淇敼澶у皬 - this.setResizable(false); - //璁剧疆鍙互鐐瑰嚮鍏抽棴 - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - } - - public void componentListener(){ - /* - * 鍙戦佸叏浣撴垚鍛樻寜閽 - */ - bt01.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - label.setText("浣犲ソ"); - } - }); - /* - * 鍙戦佹寜閽 - */ - bt02.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - - } - }); - } - -} +package com.server; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.Toolkit; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.EtchedBorder; +import javax.swing.border.TitledBorder; + +import com.server.control.NewWatchFrame; +import com.server.util.GenerateDate; + +public class Server_Frame extends JFrame { + private static final long serialVersionUID = 1L; + private static JPanel p1 = new JPanel(new GridLayout(1, 10)); // 定义一个中间容器,存放顶部9个按钮+1个标签 + private static JButton[] btn = new JButton[13];// 为13个按钮添加消息提示 + private static JLabel label = new JLabel(" 此处显示时间"); // 显示时间的标签 + private static JPanel p2 = new JPanel(); + private static Box box = Box.createVerticalBox(); + private static JPanel p3 = new JPanel(new BorderLayout()); + private static JPanel p4 = new JPanel(new BorderLayout());// 存第1个文本框 + private static JTextArea textArea01 = new JTextArea(5, 40);// 定义第2个,第3个文本框 + private static JTextArea textArea02 = new JTextArea(3, 6); + private static JTextArea textArea03 = new JTextArea(5, 55); + private static Box box01 = Box.createVerticalBox(); + private static Box box02 = Box.createHorizontalBox(); + private static JButton bt01 = new JButton("发送至全体成员");// 定义两个放按钮 + private static JButton bt02 = new JButton("发送"); + private static JPanel p5 = new JPanel(); + private static JPanel p6 = new JPanel(new GridLayout()); + private static String[] message = new String[] { "视频录像", "学生信息", "屏幕监控", "锁住客户机", "点名签到", "远程控制", "放大学生屏幕", "文件分发", "消息发送", "总开关", "", + "", "设置" };// 设置按钮提示信息 + /* + * 存放52个按钮与其标识的Map数组 线程同步的 + */ + public static Map btMap = Collections.synchronizedMap(new HashMap()); + /* + * 点击按钮的标识 + */ + public static int clickedNum = -1; + /* + * 放大权限 + */ + public static boolean isLarge = false; + /* + * 监控功能权限 + */ + public static boolean isMonitor = false; + /* + * getter\setter + */ + public static JButton[] bt = new JButton[52]; + + private SystemTray tray; + + private TrayIcon trayIcon; + + /** + * @return the textArea03 + */ + public static JTextArea getTextArea03() { + return textArea03; + } + + /** + * @param textArea03 + * the textArea03 to set + */ + public static void setTextArea03(JTextArea textArea03) { + Server_Frame.textArea03 = textArea03; + } + + // 初始化窗口函数 + public Server_Frame() throws Exception { + // 设置窗体标题 + this.setTitle("远程桌面监控系统"); + // 设置窗体大小 + this.setSize(1331, 736); + /* + * 设置窗口处于屏幕正中间 + */ + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + // 获取屏幕设备的宽度 + int width = (int) d.getWidth();// 1366 + // 获取屏幕设备的高度 + int height = (int) d.getHeight();// 768 + // 设置窗体处于正中间 + this.setLocation((width - 1331) / 2, (height - 736) / 2); + + /* + * 设置程序运行的图标 + */ + + Toolkit tk = Toolkit.getDefaultToolkit(); + + Image img = tk.getImage(this.getClass().getResource("/images/0.png")); + + this.setIconImage(img); + + // 设置窗口关闭事件监听 + + addWindowListener(new WindowAdapter() { + +// public void windowClosing(WindowEvent e) { +// +// // 将托盘图标添加到系统的托盘实例中 +// +// try { +// +// tray.add(trayIcon); +// +// System.out.println("关闭"); +// //当前窗口关闭 +// Server_Frame.this.setVisible(false); +// +// } catch (AWTException e1) { +// +// e1.printStackTrace(); +// +// } +// +// } +// + }); + + /* + * 设置托盘 + */ + + if (SystemTray.isSupported()) { + + System.out.println("调 用tray"); + + tray(); + + } + + // 分别创建9个上标题按钮 + for (int i = 0; i < 9; i++) { + btn[i] = new JButton(new Font(message[i],Font.ITALIC,10).getName(), new ImageIcon(this.getClass().getResource("/images/" + i + ".png"))); + btn[i].setVerticalTextPosition(JButton.BOTTOM); + btn[i].setHorizontalTextPosition(JButton.CENTER); + btn[i].setIconTextGap(10); + p1.add(btn[i]); + btn[i].setToolTipText(message[i]); + } + p1.add(label); + p2.setBorder(new TitledBorder(new EtchedBorder(), "用户列表")); + /* + * 创建左边的4个按钮 + */ + for (int i = 9; i < btn.length; i++) { + btn[i] = new JButton(new ImageIcon(this.getClass().getResource("/images/" + i + ".png"))); + box.add(Box.createHorizontalStrut(1)); + box.add(btn[i]); + btn[i].setToolTipText(message[i]); + } + + /* + * 为p2添加滚动条 为52个按钮添加提示 + */ + + p2.setLayout(new GridLayout(13, 2)); + + for (int i = 0; i < bt.length; i++) { + bt[i] = new JButton((i + 1) + "号机", new ImageIcon(this.getClass().getResource("/images/huaji.png"))); + bt[i].setToolTipText((i + 1) + " 号 电 脑 "); + bt[i].setVerticalTextPosition(JButton.BOTTOM); + bt[i].setHorizontalTextPosition(JButton.CENTER); + bt[i].setIconTextGap(90); + p2.add(bt[i]); + } + + /* + * 为p2添加滚动条 + */ + JScrollPane js_p2 = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); + js_p2.setViewportView(p2); + p2.setPreferredSize(new Dimension(400, 2800)); + p2.revalidate(); + + p3.add(js_p2, BorderLayout.CENTER); + p3.add(box, BorderLayout.EAST); + + p4.setBorder(new TitledBorder(new EtchedBorder(), "信息管理")); + + textArea01.setLineWrap(true); + textArea01.setWrapStyleWord(true); + JScrollPane js_01 = new JScrollPane(textArea01); + + textArea02.setLineWrap(true); + textArea02.setWrapStyleWord(true); + JScrollPane js_02 = new JScrollPane(textArea02); + + box02.add(bt01); + box02.add(Box.createHorizontalStrut(10)); + box02.add(bt02); + + box01.add(js_02); + box01.add(box02); + + /* + * 设置布局 + */ + p4.add(js_01, BorderLayout.WEST); + p4.add(box01, BorderLayout.EAST); + + p5.setBorder(new TitledBorder(new EtchedBorder(), "用户记录")); + + /* + * 文本框 + */ + // 设置自动换行、自动换字功能 + textArea03.setLineWrap(true); + textArea03.setWrapStyleWord(true); + textArea03.setEditable(false); + JScrollPane js_03 = new JScrollPane(textArea03); + + p5.add(js_03); + + // 存第p4,p5 + p6.add(p4); + p6.add(p5); + + /* + * 给52个按钮做个映射 每个按钮序号对应从1~52 + */ + for (int i = 0; i < bt.length; i++) { + btMap.put(bt[i], i + 1); + bt[i].setEnabled(false); + } + /* + * 将三个容器添加到JFrame中 + */ + this.add(p1, BorderLayout.NORTH); + this.add(p3, BorderLayout.CENTER); + this.add(p6, BorderLayout.SOUTH); + componentListener(); + + // 设置窗体显示出来 + this.setVisible(true); + // 设置窗口不能修改大小 + this.setResizable(false); + // 设置可以点击关闭 + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + private void tray() { + + // 获得本操作系统托盘的实例 + + tray = SystemTray.getSystemTray(); + + // 显示在托盘中的图标 + + ImageIcon icon = new ImageIcon(this.getClass().getResource("/images/1.png")); + + // 构造一个右键弹出式菜单 + + PopupMenu pop = new PopupMenu(); + MenuItem file = new MenuItem("发送文件"); + MenuItem screen = new MenuItem("放大学生屏幕"); + MenuItem monitor = new MenuItem("开启监控"); + MenuItem exit = new MenuItem("关闭服务"); + + pop.add(monitor); + pop.addSeparator(); + pop.add(file); + pop.addSeparator(); + pop.add(screen); + pop.addSeparator(); + pop.add(exit); + pop.addSeparator(); + + trayIcon = new TrayIcon(icon.getImage(), "实验室电子教学监控系统(服务端)", pop); + + // 这句很重要,没有会导致图片显示不出来 + + trayIcon.setImageAutoSize(true); + + /* + * 点击右下角图标的事件 + */ + trayIcon.addMouseListener(new MouseAdapter() { + + public void mouseClicked(MouseEvent e) { + + if (e.getClickCount() == 2) { + + trayIcon.setImageAutoSize(true); + Server_Frame.this.setVisible(true); + + } + + } + + }); + + try { + tray.add(trayIcon); + } catch (AWTException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + exit.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + tray.remove(trayIcon); + System.exit(0); + + } + + }); + + } + + public void componentListener() { + /* + * 最小化时隐藏该窗口 + */ + + this.addWindowListener(new WindowAdapter() { + + @Override + public void windowIconified(WindowEvent e) { + super.windowIconified(e); + Server_Frame.this.setVisible(false); + } + }); + + this.addWindowFocusListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + System.exit(0); + } + }); + /* + * 点击该按钮表示开启了监控功能 + */ + btn[2].addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + for (int i = 0; i < bt.length; i++) { + bt[i].setEnabled(true); + } + isMonitor = true; + Server_Frame.getTextArea03().append(GenerateDate.getDate() + "屏幕监控已开启!\n"); + JOptionPane.showMessageDialog(null, "屏幕监控已开启!"); + } + }); + /* + * 涉及的变量为:isLarge + */ + btn[6].addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + isLarge = true; + JOptionPane.showMessageDialog(null, "放大功能已开启!"); + Server_Frame.getTextArea03().append(GenerateDate.getDate() + "放大功能已开启!\n"); + } + }); + + btn[7].addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + /* + * 先开启监控功能才能发文件 + */ + if (!isMonitor) { + JOptionPane.showMessageDialog(null, "请先开启监控功能!么么哒!"); + } else if (Server.ipMap.size() <= 0) { + JOptionPane.showMessageDialog(null, "分发文件必须至少有一台学生电脑连接上"); + } else { + Server.fileFlag = true; + Server_Frame.getTextArea03().append("true"); + } + + } + }); + /* + * 52个按钮,如果放大功能允许 + */ + + for (int i = 0; i < bt.length; i++) { + bt[i].addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (isMonitor == true) { + clickedNum = btMap.get(e.getSource()); + if (isLarge == true) { + /* + * 获取按钮点击源头对应的序号1~52 + */ + /* + * 如果该电脑未连接 + */ + if (clickedNum > Server.ipMap.size()) { + Server_Frame.getTextArea03() + .append(GenerateDate.getDate() + clickedNum + " 号 电 脑 未 链 接 !\n"); + } else { + new NewWatchFrame(); + } + } else { + + if (clickedNum > Server.ipMap.size()) { + Server_Frame.getTextArea03() + .append(GenerateDate.getDate() + clickedNum + " 号 电 脑 未 链 接 !\n"); + } else { + JOptionPane.showMessageDialog(null, "请先开启放大功能!么么哒!"); + Server_Frame.getTextArea03().append(GenerateDate.getDate() + "请先开启放大功能!\n"); + } + } + } else { + JOptionPane.showMessageDialog(null, "请先开启监控功能!"); + } + } + }); + } + /* + * 发送全体成员按钮 + */ + bt01.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + label.setText("你好"); + } + }); + /* + * 发送按钮 + */ + bt02.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + Server_Frame.getTextArea03().append("发送\n"); + } + }); + + } + +} diff --git a/Test_03.rar b/Test_03.rar new file mode 100644 index 0000000..7aa03b3 Binary files /dev/null and b/Test_03.rar differ diff --git a/WriteUserText.java b/WriteUserText.java new file mode 100644 index 0000000..11706f2 --- /dev/null +++ b/WriteUserText.java @@ -0,0 +1,26 @@ +package com.server.util; + +import com.server.Server_Frame; + +public class WriteUserText extends Thread { + + private String ip = null; + + /* + * 构造器 + */ + public WriteUserText(String ip) { + this.ip = ip; + + } + + /* + * 线程体 一个线程实现记录一个登陆用户 + */ + @Override + public synchronized void run() { + + Server_Frame.getTextArea03().append(GenerateDate.getDate() + ip+"用户已登录"+"\n"); + + } +} diff --git a/message.png b/message.png new file mode 100644 index 0000000..1b3d619 Binary files /dev/null and b/message.png differ diff --git "a/\345\217\221\351\200\201\346\226\207\344\273\266.gif" "b/\345\217\221\351\200\201\346\226\207\344\273\266.gif" new file mode 100644 index 0000000..79b879c Binary files /dev/null and "b/\345\217\221\351\200\201\346\226\207\344\273\266.gif" differ diff --git "a/\345\217\221\351\200\201\346\266\210\346\201\257.gif" "b/\345\217\221\351\200\201\346\266\210\346\201\257.gif" new file mode 100644 index 0000000..dda9746 Binary files /dev/null and "b/\345\217\221\351\200\201\346\266\210\346\201\257.gif" differ diff --git "a/\345\276\256\344\277\241\346\210\252\345\233\276_20161007161724.png" "b/\345\276\256\344\277\241\346\210\252\345\233\276_20161007161724.png" new file mode 100644 index 0000000..c92a360 Binary files /dev/null and "b/\345\276\256\344\277\241\346\210\252\345\233\276_20161007161724.png" differ diff --git "a/\346\217\220\344\272\244\344\275\234\344\270\232\357\274\214\347\255\276\345\210\260\357\274\214\344\270\276\346\211\213\357\274\214\345\205\263\351\227\255\346\234\215\345\212\241.gif" "b/\346\217\220\344\272\244\344\275\234\344\270\232\357\274\214\347\255\276\345\210\260\357\274\214\344\270\276\346\211\213\357\274\214\345\205\263\351\227\255\346\234\215\345\212\241.gif" new file mode 100644 index 0000000..c01ed9f Binary files /dev/null and "b/\346\217\220\344\272\244\344\275\234\344\270\232\357\274\214\347\255\276\345\210\260\357\274\214\344\270\276\346\211\213\357\274\214\345\205\263\351\227\255\346\234\215\345\212\241.gif" differ diff --git "a/\346\241\214\351\235\242\347\233\221\346\216\247\344\270\216\346\224\276\345\244\247\345\261\217\345\271\225.gif" "b/\346\241\214\351\235\242\347\233\221\346\216\247\344\270\216\346\224\276\345\244\247\345\261\217\345\271\225.gif" new file mode 100644 index 0000000..773cf03 Binary files /dev/null and "b/\346\241\214\351\235\242\347\233\221\346\216\247\344\270\216\346\224\276\345\244\247\345\261\217\345\271\225.gif" differ diff --git "a/\350\277\234\347\250\213\346\241\214\351\235\242\346\216\247\345\210\266.gif" "b/\350\277\234\347\250\213\346\241\214\351\235\242\346\216\247\345\210\266.gif" new file mode 100644 index 0000000..0045fce Binary files /dev/null and "b/\350\277\234\347\250\213\346\241\214\351\235\242\346\216\247\345\210\266.gif" differ