高编-S端

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package server;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.*;
import javax.swing.DefaultListModel;
/**
 *
 * @author ch
 */
public class ServerFrame extends javax.swing.JFrame {
    ServerSocket ss;
    ServerSocket datass;
    List<User> userlist=new ArrayList<User>();
    DefaultListModel dlm=new DefaultListModel();
    String uploadDir = "upload/";
    String downloadDir = "upload/";
    /**
     * Creates new form ServerFrame
     */
    public ServerFrame() {
        initComponents();
        jList1.setModel(dlm);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jtPort = new javax.swing.JTextField();
        btnStart = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtMessage = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();
        jtSendMessage = new javax.swing.JTextField();
        btnSend = new javax.swing.JButton();
        btnStop = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("服务端口:");

        jtPort.setText("8889");

        btnStart.setText("启动服务器");
        btnStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnStartActionPerformed(evt);
            }
        });

        jtMessage.setColumns(20);
        jtMessage.setRows(5);
        jScrollPane1.setViewportView(jtMessage);

        jLabel2.setText("发送消息");

        btnSend.setText("发送");
        btnSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSendActionPerformed(evt);
            }
        });

        btnStop.setText("停止服务");
        btnStop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnStopActionPerformed(evt);
            }
        });

        jList1.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane2.setViewportView(jList1);

        jLabel3.setText("在线用户列表");
    }
    private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        int port =Integer.parseInt(jtPort.getText());
        try {
            ss=new ServerSocket(port);
            datass = new ServerSocket(10056);
            jtMessage.setText("服务器开启\n");
            new AcceptThread().start();
               
        } catch (IOException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                        

    private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        if (jList1.getSelectedIndex() < 0) {
            return;
        }
        String username = jList1.getSelectedValue().toString();
        for (User user : userlist) {
            if (username.equals(user.username)) {
                user.sout.println("message,"+jtSendMessage.getText());
                user.sout.flush();
                jtMessage.append("发送"+username+"的消息:" + jtSendMessage.getText() + "\n");
                jtSendMessage.setText("");
            }
        }
    }                                       
    class AcceptThread extends Thread{
         public void run()
                {
                    try {
                        while(true){
                           Socket clientSocket=ss.accept();
                        jtMessage.append("客户端"+clientSocket.getInetAddress()+':'+clientSocket.getPort()+"连接服务器。\n");
                          User user=new User(clientSocket);
                          new ReceiveThread(user).start();
                          userlist.add(user);
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
           
            
    }
    class ReceiveThread extends Thread
    {
        User user;
        public ReceiveThread(User user)
        {
            this.user=user;
        }
         public void run()
                            {
                                while(true)
                                {
                                    try {
                                        String message=user.sin.readLine();
                                        jtMessage.append(user.clientSocket.getInetAddress()+":"+user.clientSocket.getPort()+"接受到的消息:"+message+"\n");
                                        if("logout".equals(message))
                                        {
                                            user.sout.println("logout");
                                            user.sout.flush();
                                           // jtMessage.append("对方已停止发送:"+message+"\n");
                                            user.sin.close();
                                            user.sout.close();
                                            user.clientSocket.close();
                                            userlist.remove(user);
                                            dlm.removeElement(user.username);
                                            for(User anotherUser:userlist)
                                            {
                                                anotherUser.sout.println("logout,"+user.username);
                                                anotherUser.sout.flush();
                                            }
                                           // btnSend.setEnabled(false);
                                            break;
                                            
                                        }
                                        /*login,username   :新客户登录服务器的时候,服务器发送所有在线用户信息给新登录客户,同时把新登录客户信息发送给所有在线用户
        logout  :服务器发送退出客户信息给所有在线客户
        message,消息
        talk,接受者,发送者,消息:服务器找到接受者的名字,遍历在线用户列表,找到对应的User,利用他的输出流将消息转发给接受者*/
                                        String[] mes=message.split(",");
                                        switch (mes[0]) {
                                            case "login":
                                                String username = mes[1];
                                                user.username = username;
                                                dlm.addElement(username);
                                                for (User anotherUser : userlist) {
                                                    if(user==anotherUser) continue;
                                                    user.sout.println("login," + anotherUser.username);
                                                    user.sout.flush();
                                                    anotherUser.sout.println("login," + user.username);
                                                    anotherUser.sout.flush();
                                                }
                                                break;
                                            case "message":
                                                jtMessage.append(user.username + "说:" + message + "\n");
                                                break;
                                            case "talk":
                                                String receiver = mes[1];
                                                for (User rece : userlist) {
                                                    if (receiver.equals(rece.username)) {
                                                        rece.sout.println(message);
                                                        rece.sout.flush();
                                                    }
                                                }
                                                break;
                                            case "group":
                                                String msgSender = mes[1];
                                                for (User rece :userlist) {
                                                    if (!msgSender.equals(rece.username)) {
                                                        rece.sout.println(message);
                                                        rece.sout.flush();
                                                    } 
                                                }
                                                break;
                                            case "upload":
                                                String filename = message.substring(7);
                                                final File dest = new File(uploadDir + filename);
                                                new Thread() {
                                                    public void run() {
                                                        try {
                                                            Socket s = datass.accept();
                                                            DataInputStream dis = new DataInputStream(s.getInputStream());
                                                            long fileLength = dis.readLong();
                                                            FileOutputStream fos = new FileOutputStream(dest);
                                                            long recvLength = 0;
                                                            
                                                            byte[] buffer = new byte[1024];
                                                            
                                                            while(recvLength < fileLength) {
                                                                int length = dis.read(buffer);
                                                                recvLength += length;
                                                                fos.write(buffer, 0, length);
                                                            }
                                                            
                                                            dis.close();
                                                            fos.close();
                                                            s.close();
                                                            
                                                        } catch (IOException ex) {
                                                            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
                                                        }
                                                    }
                                                }.start();
                                                break;
                                                
                                            case "download1":
                                                File dir = new File(downloadDir);
                                                String[] files = dir.list();
                                                String msg = "filelist,";
                                                for(String f : files) {
                                                    msg += f + ",";
                                                }
                                                user.sout.println(msg);
                                                user.sout.flush();
                                                break;
                                                
                                            case "download2":
                                                File src = new File(downloadDir + message.substring(10));
                                                
                                                new Thread(){
                                                    public void run() {
                                                        try {
                                                            Socket s = datass.accept();
                                                        } catch (IOException ex) {
                                                            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
                                                        }
                                                    }
                                                }.start();
                                                break;
                                            default:
                                        }
                                        
                                        
                                        
                                    } catch (IOException ex) {
                                        Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
                                    }
                                }
                            } 
    }
    private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {                                        
        try {
            // TODO add your handling code here:
            ss.close();
        } catch (IOException ex) {
            Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                       

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ServerFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ServerFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnSend;
    private javax.swing.JButton btnStart;
    private javax.swing.JButton btnStop;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jtMessage;
    private javax.swing.JTextField jtPort;
    private javax.swing.JTextField jtSendMessage;
    // End of variables declaration                   
}
public class User {
   public  Socket clientSocket;
   public BufferedReader sin;
   public  PrintWriter sout;
   public String username;
   public User(Socket s)
   {
       try {
           clientSocket=s;
           sin=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
           sout=new PrintWriter(clientSocket.getOutputStream());
       } catch (IOException ex) {
           Logger.getLogger(User.class.getName()).log(Level.SEVERE, null, ex);
       }
   }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值