2021-06-14:java聊天软件编写

客户端代码:

界面代码存放于client_view包中。

登录界面:

package client_view;
import client_model.Clientlogin;
import common.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//客户端登录界面
public class Login extends JFrame  {
    //顶部组件
    public JLabel jbl1;
    //中心组件
    public   JTabbedPane jtp;
    public  JPanel P1,p2,p3;
    public  JPanel P1_p1,P1_p2,P1_p3,P1_p4;
    public  JLabel P1_jla1,P1_jla2,P1_jla3,P1_jla4,P1_jla5,P1_jla6,P1_jla7,P1_jla8;//号码标签,密码标签,
    public  JButton P1_jb1;
    public  JTextField P1_jte1;//账号输入条
    public JPasswordField P1_jPa1;//密码输入条
    public  JCheckBox P1_box1,P1_box2;//勾选项
    //底部组件
    public  JPanel jp1;
    public  JButton jbl3_1, jbl3_2, jbl3_3;
    //监听器
    public  Loginlistener listener1;
    //后台
    public   Clientlogin client;
    public static void main(String[] args) {

        Login login = new Login();
    }
    public Login() {
        this.setTitle("趣说");
        //顶部背景图
        jbl1 = new JLabel(new ImageIcon("image/顶部背景.png"));
        client=new Clientlogin(this);
        listener1=new Loginlistener(this,client);
        //中部选项卡管理、
        P1=new JPanel(new GridLayout(3,3));
        P1_p1=new JPanel(new GridLayout(1,2));
        P1_p2=new JPanel(new GridLayout(1,2));
        P1_p3=new JPanel(new GridLayout(1,2));
        P1_jla1=new JLabel("账号",JLabel.CENTER);
        P1_jla2=new JLabel("密码",JLabel.CENTER);
        P1_jla3=new JLabel("找回密码",JLabel.CENTER);
        P1_jla3.setForeground(Color.blue);
        P1_jla4=new JLabel("帮助");
        P1_jla4.setForeground(Color.blue);
        P1_jla5=new JLabel("注册账号",JLabel.RIGHT);
        P1_jla5.addMouseListener(listener1);
        P1_jla5.setForeground(Color.blue);
        P1_jla6=new JLabel();
        P1_jla7=new JLabel();
        P1_jla8=new JLabel();
        P1_jte1=new JTextField();
        P1_jPa1=new JPasswordField();
        P1_box1=new JCheckBox("自动登录");
        P1_box2=new JCheckBox("记住密码");
        P1.add(P1_jla1);
        P1.add(P1_jte1);
        P1.add(P1_jla6);
        P1.add(P1_jla2);
        P1.add(P1_jPa1);
        P1.add(P1_jla7);
        P1_p1.add(P1_box2);
        P1_p1.add(P1_jla5);
        P1_p2.add(P1_jla3);
        P1_p2.add(P1_jla4);
        P1_p3.add(P1_jla8);
        P1_p3.add(P1_box1);
        P1.add(P1_p3);
        P1.add(P1_p1);
        P1.add(P1_p2);
        this.add(P1,"Center");
        //底部登录控件
        jp1=new JPanel();
        jbl3_1=new JButton(new ImageIcon("image/登录.png"));
        System.out.println("登录后台建立成功");
        System.out.println("登录监听建立成功");
        jbl3_1.addActionListener(listener1);
        jp1.add(jbl3_1);
        this.add(jp1,"South");
        this.add(P1,"Center");
        this.add(jbl1, "North");
        this.setBounds(750,380,470, 337);
        this.setResizable(false);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

注册界面:

package client_view;
import javax.swing.*;
import java.awt.*;
import client_model.*;
public class Register_window extends JFrame {
   public JTextField username;
  public   JTextField id;
  public   JPasswordField password;
    JButton jb1,jb2;
    JPanel jp;
JLabel jl1,jl2,jl3;

Registerlistener listener;
Register register;
    public  Register_window(Register r)
    {
        register=r;
        username=new JTextField();
        id=new JTextField();
        password =new JPasswordField();
        listener=new Registerlistener(this,register);
        jb1=new JButton("取消");
        jb1.addActionListener(listener);
        jb2=new JButton("注册");
        jb2.addActionListener(listener);
        jl1=new JLabel("用户名:");
        jl2=new JLabel("账号:");
        jl3=new JLabel("密码:");
        jp=new JPanel(new GridLayout(4,2));
        jp.add(jl1);
        jp.add(username);
        jp.add(jl2);
        jp.add(id);
        jp.add(jl3);
        jp.add(password);
        jp.add(jb1);
        jp.add(jb2);
        this.setName("注册");
        this.add(jp);
        this.setBounds(750,380,470, 337);
        this.setResizable(false);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

好友列表界面:

package client_view;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Collection;

import client_model.*;
import common.Friend;
import common.Friendslist;
import common.Online;
import common.User;

//好友列表
public  class Friend_list_window extends JFrame  {
   public JPanel jp1,jp1_1,jp2;//1.好友
    JButton jb1,jb2;
    JScrollPane jsc1;
    //群聊主键
    JPanel jpq1,jpq1_1,jpq2;
    JButton jbq1,jbq2;
    JScrollPane jscq1;
    JLabel jbl1,jbl2_1,jbl2_2;//添加好友 创建群聊,加入群聊
   public Friend_list_listener listener;
    Friend_list list;
    public String ID;
    public String Username;
   public Chat_window chatWindow[];
   public JLabelclass[] jlac;
   public JLabel[] jla;
   public Online olf;
    public Addfriend addfriend;
    CardLayout card=new CardLayout();
    Friendslist friendlist;
    Client_link server;
    public static void main(String[] args) {
           }
    public Friend_list_window(String UserID, String name, Friend_list l, Friendslist flist, Client_link s, Online onlf)
    {
        olf=onlf;
        Username=name;
        list=l;
        ID=UserID;
        server=s;
        this.setTitle(Username);
        friendlist=flist;
        //第一张卡片 好友列表
        listener=new Friend_list_listener(list,this);
        jp1=new JPanel(new BorderLayout());
        int n=friendlist.getFriends().size();
        System.out.println("好友数"+n);
        jp1_1=new JPanel(new GridLayout(n+20,1,4,4));//好友列表容器
        jb1=new JButton("我的好友");
        jbl1=new JLabel("添加好友");
        jbl1.addMouseListener(listener);
        jp1_1.add(jbl1);
         jla=new JLabel[n];
         jlac=new JLabelclass[n];
         chatWindow=new Chat_window[jla.length];
        addfriend=new Addfriend(list);
        int i=0;
        Collection values = friendlist.getFriends().values();  //获取Map集合的value集合
        for(Object object:values){
            Friend f=(Friend) object;
            jla[i]=new JLabel(f.getName(),new ImageIcon("image/头像.png"),JLabel.LEFT);
            jlac[i]=new JLabelclass(jla[i],f.getId(),Username,f.getName());
           if(olf.onlinelist.containsKey(jlac[i].ID)){
              String title=f.getName()+" (在线)";
               jla[i].setText(title);
           }
            jla[i].addMouseListener(listener);
            jp1_1.add(jla[i]);
            chatWindow[i]=new Chat_window(jla[i].getText(),jlac[i].ID,ID,server,Username);
            i++;
        }
        jsc1=new JScrollPane(jp1_1);
        jp2=new JPanel(new BorderLayout());
        jb2=new JButton("群聊");
        jb2.addActionListener(listener);
        jp2.add(jb2);
        jp1.add(jb1,"North");
        jp1.add(jsc1,"Center");
        jp1.add(jb2,"South");
        //群聊卡片
        jpq1=new JPanel(new BorderLayout());
        jpq1_1=new JPanel(new GridLayout(23,1,4,4));//好友列表容器
        jbq1=new JButton("我的好友");
        jbq1.addActionListener(listener);
        jbl2_1=new JLabel("创建群聊");
        jpq1_1.add(jbl2_1);
        jbl2_2=new JLabel("加入群聊");
        jpq1_1.add(jbl2_2);
        JLabel[] jlaq=new JLabel[5];
        for (int j=0;j<jlaq.length;j++){
            jlaq[j]=new JLabel(j+1+"",new ImageIcon("image/群头像.png"),JLabel.LEFT);
            jlaq[j].addMouseListener(listener);
            jpq1_1.add(jlaq[j]);
        }
        jscq1=new JScrollPane(jpq1_1);
        jpq2=new JPanel(new BorderLayout());
        jbq2=new JButton("群聊");
        jpq2.add(jbq1,"North");
        jpq2.add(jbq2,"South");
        jpq1.add(jpq2,"North");
        jpq1.add(jscq1,"Center");
        //创建界面
        this.setLayout(card);
        this.add(jp1,"1");
        this.add(jpq1,"2");
        this.setBounds(1300,200,330,700);
        this.setVisible(true);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

对话窗口界面:

package client_view;
import client_model.Client_Chat;
import client_model.Client_link;

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class Chat_window extends JFrame  {
    public JButton jb1,jb2;
    public JPanel jp1;
    public  JTextArea jt1,jt2;
    public Client_Chat Clientchat;
    public  Chat_windowlistener listener1;
    public String OwnerId;
    public String friendID;
    public Client_link server;
    public String hostname;
   public Chat_window(String Name,String id,String Owner,Client_link s,String name)
    {
        hostname=name;
        server=s;
        OwnerId=Owner;
        friendID=id;
        jb1=new JButton("发送");
        jb2=new JButton("其他");
        jp1=new JPanel();
        jp1.setLayout(null);
        jt1=new JTextArea();
        jt2=new JTextArea();
        jt1.setBounds(5,5,574,300);
        jt2.setBounds(5,310,574,110);
        jb1.setBounds(374,426,100,30);
        jb2.setBounds(479,426,100,30);
        jp1.add(jb1);
        jp1.add(jb2);
        jp1.add(jt1);
        jp1.add(jt2);
        Clientchat=new Client_Chat(this,server);
        listener1=new Chat_windowlistener(Clientchat);
        jb1.addActionListener(listener1);
        this.setTitle(Name);
        this.add(jp1);
        Random r= new Random();

        this.setBounds(750+r.nextInt(100),380+r.nextInt(50),600, 500);
        this.setResizable(false);
        this.setVisible(false);
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
    }
}

好友添加界面:

package client_view;

import client_model.Addfriend;

import javax.swing.*;
import java.awt.*;

public class Addfriend_windows extends JFrame {

Addfriend addfriend;
   public JTextField idinput;
   public JButton jb1,jb2;
   public JLabel jla;
  public   JPanel jp;
   public Addfriend_listener listener;
 public    Addfriend_windows(Addfriend af){
     addfriend=af;
        listener=new Addfriend_listener(addfriend,this);
        jp=new JPanel(new GridLayout(2,2));
        jla=new JLabel("账号");
        idinput=new JTextField();
        jb1=new JButton("取消");
        jb2=new JButton("添加");
        jb2.addActionListener(listener);
        jp.add(jla);
        jp.add(idinput);
        jp.add(jb1);
        jp.add(jb2);
        this.setTitle("添加好友");
        this.add(jp);
        this.setBounds(650,280,470, 337);
        this.setResizable(false);
        this.setVisible(false);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

}

 各界面的监听器:存放于client_view包中。

登录界面监听器:

package client_view;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import common.User;
import client_model.*;
import javax.swing.*;
//登录界面监听
public class Loginlistener extends JFrame implements ActionListener, MouseListener {
    Clientlogin loginclient;
    Login window;
    Loginlistener(Login w,Clientlogin c)
    {
        window=w;
        loginclient=c;
        System.out.println("后台传递完成");
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==window.jbl3_1) {
            loginclient.check_login();
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getClickCount()==1)
        {
          new Register(window.client);
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        JLabel j1=(JLabel) e.getSource();
        j1.setForeground(Color.LIGHT_GRAY);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        JLabel j1=(JLabel) e.getSource();
        j1.setForeground(Color.black);
    }
}

注册界面监听器:

package client_view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import client_model.*;
import common.*;

public class Registerlistener implements ActionListener {
    Register register;
    Register_window window;

    Registerlistener(Register_window w, Register r) {
        register = r;
        window = w;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == window.jb1) {

            window.dispose();
        }
        if (e.getSource() == window.jb2) {
            register.Registersend();

        }

    }
}

好友列表界面监听器:

package client_view;
import client_model.Friend_list;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import common.*;
public class Friend_list_listener implements ActionListener , MouseListener {
    Friend_list list;
    Friend_list_window window;
    Friend_list_listener(Friend_list l,Friend_list_window w)
    {
        list=l;
        window=w;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==window.jbq1)
        {
            window.card.show(window.getContentPane(),"1");
        }
        if (e.getSource()==window.jb2)
         {
             window.card.show(window.getContentPane(),"2");
         }

    }


    public void mouseClicked(MouseEvent e) {
        int i;
        int flag = 0;
        for (i = 0; i < window.jla.length; i++) {
            if (e.getSource() == window.jla[i]) {
                flag = 1;
                break;
            }
        }
        if (e.getClickCount() == 2 && e.getButton() == 1) {

            if (e.getSource() == window.jbl1) {
                window.addfriend.window.setVisible(true);
            }

            if (flag == 1) {
                if (e.getSource() == window.jla[i]) {
                    window.chatWindow[i].setVisible(true);
                }
            }


        }
        if (e.getButton() == 3) {
            int n = JOptionPane.showConfirmDialog(window, "是否删除该好友?", "删除好友", JOptionPane.YES_NO_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                massage m = new massage();
                m.setType("4");
                m.setSender(window.ID);
                m.setGetter(window.jlac[i].ID);
                System.out.println("删除" + window.jlac[i].jla.getText());
                window.server.deletfriend(m);
            }

        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        JLabel j1 = (JLabel) e.getSource();
        j1.setForeground(Color.LIGHT_GRAY);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        JLabel j1 = (JLabel) e.getSource();
        j1.setForeground(Color.black);
    }
}

聊天会话窗口监听器:

package client_view;

import client_model.Client_Chat;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import common.massage;

//聊天界面监听
public class Chat_windowlistener extends JFrame implements ActionListener {
    Chat_window window;
    Client_Chat clientchat;
    massage textmassage;

    Chat_windowlistener(Client_Chat chat) {
        clientchat = chat;
    }

    public void actionPerformed(ActionEvent e) {
        clientchat.sendmassage();
    }
}

好友添加界面监听器:

package client_view;

import client_model.Addfriend;
import client_model.Register;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Addfriend_listener implements ActionListener {
    Addfriend addfriend;
    Addfriend_windows window;

    Addfriend_listener(Addfriend a, Addfriend_windows w) {
        addfriend = a;
        window = w;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == window.jb2) {
            addfriend.addmassagesend();
        }


    }
}

辅助类:

package client_view;

import javax.swing.*;

public class JLabelclass extends JLabel {
    public JLabel jla;
    public String ID;
    public String hostname;
    public String Name;
    public JLabelclass(JLabel la,String id,String hname,String fname )
    {
        hostname=hname;
        jla=la;
        ID=id;
        Name=fname;
    }
}

 程序后台代码:存放于client_model包中。

登录界面后台:

package client_model;
import common.*;
import client_view.*;
import javax.swing.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Collection;

//登录界面后台 检查账号,密码;
public class Clientlogin extends JFrame {

    Client_link loginlink;
    Login window;
     public Clientlogin(Login wd) {
         loginlink=new Client_link();
         window =wd;
    }
    public  void check_login(){
         User user=new User();
         user.setType("0");
         user.setUserid(window.P1_jte1.getText());
         user.setPassword(new String(window.P1_jPa1.getPassword()));
         System.out.println(user.getUserid()+"++++++++++++++++++");
        System.out.println("调用服务器检查函数");
         Friendslist friendslist=loginlink.sendlogintoserver(user);
         user.setUsername(friendslist.getOwername());
         System.out.println(user.getUsername());
         System.out.println(friendslist.getFriends().size());
         if(friendslist.getLoginsign().equals("1")) {
             try {
                 ObjectInputStream inobj = new ObjectInputStream(loginlink.s.getInputStream());
                 Online online =null;
                 online=(Online) inobj.readObject();
                     System.out.println("收到");
                     Collection Values = online.onlinelist.values();  //获取Map集合的value集合
                     for(Object object:Values){
                          String olf=(String) object;
                        System.out.println(olf);
                     }
                     System.out.println("我是"+friendslist.getOwner()+"我登录了");
                 window.dispose();
                 loginlink.start();
                     Friend_list friend_list=new Friend_list( user,loginlink,friendslist,online);
             }catch (Exception e)
             {
                 e.printStackTrace();
             }
         }
        if(friendslist.getLoginsign().equals("0")){
            loginlink=new Client_link();
            JOptionPane.showMessageDialog(window,"                 密码错误","提示",JOptionPane.WARNING_MESSAGE);
        }
    }
    public  Friendslist Register(User u){
        User user=u;
        System.out.println(user.getUserid()+"调用注册");
        System.out.println("调用服务器检查函数");
        Friendslist friendslist=loginlink.sendlogintoserver(user);
        return friendslist;
    }
}

账号注册后台:

package client_model;

import client_view.*;
import common.*;

import javax.swing.*;

public class Register {
    Register_window window;
    User u;
    Clientlogin login;

    public Register(Clientlogin l) {
        login = l;
        window = new Register_window(this);
    }

    public void Registersend() {
        u = new User();
        u.setType("1");
        u.setUsername(window.username.getText());
        u.setUserid(window.id.getText());
        u.setPassword(new String(window.password.getPassword()));
        System.out.println("用户注册生成");
        Friendslist friendslist = login.Register(u);
        if (friendslist.getLoginsign().equals("1")) {
            System.out.println("注册成功");
            login.loginlink = new Client_link();
            window.dispose();
            JOptionPane.showMessageDialog(login.window, "            注册成功", "提示", JOptionPane.WARNING_MESSAGE);
        }
        if (friendslist.getLoginsign().equals("0")) {
            System.out.println("注册失败");
            login.loginlink = new Client_link();
            JOptionPane.showMessageDialog(window, "            该账号已被注册", "提示", JOptionPane.WARNING_MESSAGE);
        }

    }

}

好友列表后台:

package client_model;
import client_view.*;
import common.*;

public class Friend_list {
    Friend_list_window window;
    Client_link server;
    User user;
    Friendslist flist;
    Online onlf;
  public   Friend_list(User u,Client_link link,Friendslist f,Online olf)
    {
        user=u;
        flist=f;
        this.server=link;
        onlf=olf;
        window=new Friend_list_window(u.getUserid(),u.getUsername(),this,flist,server,onlf);
        server.setfriend_list(window);
    }

    
}

聊天窗口后台:

package client_model;
import client_view.Chat_window;
import common.*;

import java.text.SimpleDateFormat;
import java.util.Date;

//聊天界面后台
public class Client_Chat{
    Chat_window window;
    Client_link server;
   public Client_Chat(Chat_window wd,Client_link s)
    {
        server=s;
        this.window=wd;
    }
    public void sendmassage(){
       massage m=new massage();
       m.setType("1");
       m.setSender(window.OwnerId);
       m.setGetter(window.friendID);
       m.setTextmassage(window.jt2.getText());
                     Date NowDate = new Date();
                     SimpleDateFormat timestyle =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     String time = timestyle.format(NowDate);
       m.setSendtime(time);
       window.jt2.setText("");
       window.jt1.append(window.hostname+" ("+m.getSendtime()+"):\r\n"+m.getTextmassage()+"\r\n");
       server.sendmassage(m);
   }
   public void showmassage(massage M, String name)
   {
       window.jt1.append(name+" ("+M.getSendtime()+"):\r\n"+M.getTextmassage()+"\r\n");
   }
}

好友添加后台:

package client_model;
import client_view.*;
import common.massage;
public class Addfriend {
Friend_list list;
public  Addfriend_windows window;
massage m;
    public Addfriend(Friend_list fl)
    {
        list=fl;
        window=new Addfriend_windows(this);
    }

    public void addmassagesend()
    {
        m=new massage();
        m.setType("3");
        m.setSender(list.user.getUserid());
        m.setGetter(window.idinput.getText());
        m.setSendername(list.window.Username);
        list.server.addfriend(m);
    }


}

客户端与服务器通讯类:

package client_model;

import java.io.*;
import java.net.*;

import client_view.Chat_window;
import client_view.Friend_list_window;
import client_view.JLabelclass;
import common.Friendslist;
import common.*;

import javax.swing.*;

//客户端后台网络连接
public class Client_link extends Thread {
    Socket s;
    ObjectOutputStream outobj;
    ObjectInputStream inobj;
    Friend_list_window flw;

    Client_link() {
        flw = null;
        try {
            s = new Socket("127.0.0.1", 1235);
            System.out.println("服务器连接成功");
            outobj = new ObjectOutputStream(s.getOutputStream());
            System.out.println("传输建立");
            inobj = new ObjectInputStream(s.getInputStream());
            System.out.println("传输建立");
        } catch (Exception e) {
            System.out.println("连接失败");
        }
    }

    public void setfriend_list(Friend_list_window fw) {

        flw = fw;
        System.out.println(flw.getTitle());

    }

    public Friendslist sendlogintoserver(Object userlogin) {
        Friendslist flist = null;
        try {
            outobj.writeObject(userlogin);
            System.out.println("登录发送");
            flist = (Friendslist) inobj.readObject();
            System.out.println("登录成功接收");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("传输断开");
        }
        return flist;
    }

    public void sendmassage(massage textmassage) {
        try {
            outobj.writeObject(textmassage);
            System.out.println("消息发送");
        } catch (Exception e) {
            System.out.println("传输断开");
        }

    }

    public void addfriend(Object addfriendmassage) {
        try {
            outobj.writeObject(addfriendmassage);
            System.out.println("加好友请求发送");
        } catch (Exception e) {
            System.out.println("传输断开");
        }

    }

    public void deletfriend(massage m) {
        try {
            outobj.writeObject(m);
            System.out.println("删除好友");
        } catch (Exception e) {
            System.out.println("传输断开");
        }
    }

    public massage receive() {
        massage M = null;
        try {
            inobj = new ObjectInputStream(s.getInputStream());
            M = (massage) inobj.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (M.gettype().equals("1")) {
            for (int i = 0; i < flw.jlac.length; i++) {
                if (M.getSender().equals(flw.jlac[i].ID)) {
                    System.out.println("收到");
                    flw.chatWindow[i].Clientchat.showmassage(M, flw.jlac[i].jla.getText());
                    flw.chatWindow[i].setVisible(true);
                    break;
                }
            }
        }
        if (M.gettype().equals("3")) {
            if (M.getSender().equals(flw.ID)) {
                System.out.println("加好友成功 发送者是我自己");
                flw.jla = (JLabel[]) resizeArray(flw.jla, flw.jla.length + 1);
                flw.jla[flw.jla.length - 1] = new JLabel(M.getFriendname(), new ImageIcon("image/头像.png"), JLabel.LEFT);
                flw.jla[flw.jla.length - 1].addMouseListener(flw.listener);
                flw.jlac = (JLabelclass[]) resizeArray(flw.jlac, flw.jlac.length + 1);
                flw.jlac[flw.jlac.length - 1] = new JLabelclass(flw.jla[flw.jla.length - 1], M.getGetter(), flw.ID, M.getFriendname());
                flw.chatWindow = (Chat_window[]) resizeArray(flw.chatWindow, flw.chatWindow.length + 1);
                flw.chatWindow[flw.chatWindow.length - 1] = new Chat_window(M.getFriendname(), M.getGetter(), M.getSender(), this, flw.Username);
                if (M.isOnline()) {
                    flw.jla[flw.jla.length - 1].setText(M.getFriendname() + " (在线)");
                    flw.chatWindow[flw.chatWindow.length - 1].setTitle(M.getFriendname() + " (在线)");
                }
                flw.jp1_1.add(flw.jla[flw.jla.length - 1]);
                flw.jp1_1.validate();
                JOptionPane.showMessageDialog(flw.addfriend.window, "            添加成功", "提示", JOptionPane.WARNING_MESSAGE);
                flw.addfriend.window.setVisible(false);
            } else {
                System.out.println("加好友成功 发送者不是我自己 是" + M.getSendername());
                flw.jla = (JLabel[]) resizeArray(flw.jla, flw.jla.length + 1);
                flw.jla[flw.jla.length - 1] = new JLabel(M.getSendername() + " 111(在线)", new ImageIcon("image/头像.png"), JLabel.LEFT);
                flw.jla[flw.jla.length - 1].addMouseListener(flw.listener);
                flw.jlac = (JLabelclass[]) resizeArray(flw.jlac, flw.jlac.length + 1);
                flw.jlac[flw.jlac.length - 1] = new JLabelclass(flw.jla[flw.jla.length - 1], M.getSender(), flw.Username, M.getSendername());
                flw.chatWindow = (Chat_window[]) resizeArray(flw.chatWindow, flw.chatWindow.length + 1);
                flw.chatWindow[flw.chatWindow.length - 1] = new Chat_window(M.getSendername(), M.getSender(), M.getGetter(), this, flw.Username);
                if (M.isOnline()) {
                    flw.jla[flw.jla.length - 1].setText(M.getSendername() + " (在线)");
                    flw.chatWindow[flw.chatWindow.length - 1].setTitle(M.getSendername() + " (在线)");
                }
                flw.jp1_1.add(flw.jla[flw.jla.length - 1]);
                flw.jp1_1.validate();
            }
        }
        if (M.gettype().equals("0")) {
            System.out.println("好友添加失败");
            JOptionPane.showMessageDialog(flw.addfriend.window, "                 账号不存在", "提示", JOptionPane.WARNING_MESSAGE);
        }
        if (M.gettype().equals("4")) {
            System.out.println("删除成功");
            JOptionPane.showMessageDialog(flw, "                 删除成功", "提示", JOptionPane.WARNING_MESSAGE);

        }
        if (M.gettype().equals("5")) {
            System.out.println(M.getSender());
            for (int i = 0; i < flw.jlac.length; i++) {
                if (M.getSender().equals(flw.jlac[i].ID)) {
                    System.out.println("有人上线了");
                    System.out.println(flw.jlac[i].jla.getText() + "上线");
                    String title = flw.jla[i].getText() + " (在线)";
                    flw.jla[i].setText(title);
                    flw.chatWindow[i].setTitle(title);
                    break;
                }
            }
        }
        if (M.getType().equals("6")) {
            System.out.println(M.getSender());
            for (int i = 0; i < flw.jlac.length; i++) {
                if (M.getSender().equals(flw.jlac[i].ID)) {
                    System.out.println("有人下线了");
                    System.out.println(flw.jlac[i].jla.getText() + "下线");
                    String title = flw.jlac[i].Name;
                    flw.jla[i].setText(title);
                    flw.chatWindow[i].setTitle(title);
                    break;
                }
            }
        }
        return M;
    }

    public void run() {
        while (true) {
            System.out.println("等待接收");
            receive();
            System.out.println("成功接收信息");
        }
    }

    private static Object resizeArray(Object oldArray, int newSize) {
        int oldSize = java.lang.reflect.Array.getLength(oldArray);
        Class elementType = oldArray.getClass().getComponentType();
        Object newArray = java.lang.reflect.Array.newInstance(elementType,
                newSize);
        int preserveLength = Math.min(oldSize, newSize);
        if (preserveLength > 0)
            System.arraycopy(oldArray, 0, newArray, 0, preserveLength);
        return newArray;
    }

}


 

服务器代码:存放于server_model包中;

服务器主程序:

package server_model;

import common.Friendslist;
import common.User;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

public class myserver {
    File hashmapfile;
    FileInputStream fin;
    FileOutputStream fout;
    ObjectInputStream fobjin;
    ObjectOutputStream fobjout;

    public static void main(String args[]) {
        myserver server = new myserver();
    }

    public myserver() {
//文件准备
        hashmapfile = new File("userdata.obj");
        System.out.println(hashmapfile.isHidden());
        System.out.println(hashmapfile.getAbsolutePath());
        try {
            fin = new FileInputStream(hashmapfile);
            fobjin = new ObjectInputStream(fin);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("从文件读取哈希表");
        try {
            MassageUser.userhashmap = (HashMap<String, User>) fobjin.readObject();//读取总用户数
            System.out.println("哈希表读取成功");
        } catch (Exception e) {
            e.printStackTrace();
        }

        ServerSocket s = null;//服务器
        try {
            s = new ServerSocket(1235);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            try {
                Socket c = s.accept();//等待连接
                System.out.println("连接成功");
                //接收信息
                ObjectInputStream objin = new ObjectInputStream(c.getInputStream());
                System.out.println("传输建立");
                ObjectOutputStream objout = new ObjectOutputStream(c.getOutputStream());
                common.User u = (common.User) objin.readObject();
                System.out.println(u.getUserid());
                System.out.println(new String(u.getPassword()));
                System.out.println(u.getType());
                if (u.getType().equals("0")) {
                    System.out.println("进入登录");//登录操作
                    String pw = MassageUser.getUser(u.getUserid()).getPassword();
                    System.out.println(pw);
                    String id = MassageUser.getUser(u.getUserid()).getUserid();
                    if (u.getPassword().equals(pw) && u.getUserid().equals(id)) {//验证账号密码
                        File listfile = new File(u.getUserid() + ".obj");
                        System.out.println(listfile.getAbsolutePath());
                        try {
                            FileInputStream flin = new FileInputStream(listfile);
                            ObjectInputStream flobjin = new ObjectInputStream(flin);
                            Friendslist flist = (Friendslist) flobjin.readObject(); //读取发送好友列表
                            System.out.println(flist.getOwername() + "好友列表人数");
                            System.out.println(flist.getFriends().size());
                            objout.writeObject(flist);
                            flobjin.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        UserThread sc = new UserThread(c, objin, objout, u.getUserid());
                        System.out.println("信息正确");
                        ManageclientThread.addClientThread(u.getUserid(), sc);
                        System.out.println("进程哈希表个数" + ManageclientThread.hm.size());
                        //启动线程
                        sc.start();
                        //登录成功 单开线程
                    } else {
                        Friendslist flist = new Friendslist(null);
                        flist.setLoginsign("0");
                        objout.writeObject(flist);
                    }

                }
                if (u.getType().equals("1")) {      //注册账户
        /*   try {
               MassageUser.userhashmap = (HashMap<String, User>) fobjin.readObject();//读取总用户数
               System.out.println("哈希表读取成功");
           }catch (Exception e)
           {
               e.printStackTrace();
           }*/
                    System.out.println("注册用户是否已经存在" + MassageUser.userhashmap.containsKey(u.getUserid()));

                    if (MassageUser.userhashmap.containsKey(u.getUserid())) {
                        Friendslist flist = new Friendslist(u.getUserid());
                        flist.setLoginsign("0");
                        objout.writeObject(flist);
                        System.out.println("注册失败");
                    }
                    if (!MassageUser.userhashmap.containsKey(u.getUserid())) {
                        MassageUser.addUser(u.getUserid(), u);
                        System.out.println(u.getUsername());
                        System.out.println("注册成功");
                        Friendslist flist = new Friendslist(u.getUserid());
                        flist.setLoginsign("1");
                        objout.writeObject(flist);
                        try {
                            fout = new FileOutputStream(hashmapfile);
                            fobjout = new ObjectOutputStream(fout);
                            fobjout.writeObject(MassageUser.userhashmap);
                            System.out.println("哈希表写入文件");

                            File friendfile = new File(u.getUserid() + ".obj");
                            System.out.println(friendfile.isHidden());
                            System.out.println(friendfile.getAbsolutePath());
                            try {
                                FileOutputStream flistout = new FileOutputStream(friendfile);
                                ObjectOutputStream flistobjout = new ObjectOutputStream(flistout);
                                Friendslist friendslist = new Friendslist(u.getUserid());
                                friendslist.setLoginsign("1");
                                friendslist.setOwername(u.getUsername());
                                flistobjout.writeObject(friendslist);
                                System.out.println("新构建好友列表存入文件");


                            } catch (Exception e) {
                                e.printStackTrace();
                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }


            } catch (Exception e) {
                System.out.println("服务器错误");
                e.printStackTrace();
            }
        }
    }
}

用户服务处理线程:

package server_model;

import java.io.*;
import java.net.Socket;
import java.util.Collection;

import common.*;

//服务器与客户端通讯线程
public class UserThread extends Thread {
    Socket client;
    ObjectInputStream mobjin;
    ObjectOutputStream mobjout;
    String ID;
    public UserThread(Socket c,ObjectInputStream in,ObjectOutputStream out,String id)
    {
        mobjin=in;
        mobjout=out;
        client=c;
        ID=id;
    }
    public void run()
    {
        System.out.println("开始进入线程");
        File friend_file=new File(ID+".obj");
        System.out.println(friend_file.getAbsolutePath());
        try {
            FileInputStream flist_in = new FileInputStream(friend_file);
            ObjectInputStream flistobj_in = new ObjectInputStream(flist_in);
            Friendslist friends_list = (Friendslist) flistobj_in.readObject();
            System.out.println("成功读取好友列表");
            Online onlinelist=new Online();
            Collection Values = friends_list.getFriends().values();  //获取Map集合的value集合
            for(Object object:Values){
                Friend f=(Friend) object;
                String userid=f.getId();
                if(ManageclientThread.hm.containsKey(userid))//查询在线好友
                {
                    onlinelist.onlinelist.put(userid,userid);
                }
            }
            ObjectOutputStream folobjouts=new ObjectOutputStream(client.getOutputStream());
            folobjouts.writeObject(onlinelist);
            for(Object object:Values){
                Friend f=(Friend) object;
                String userid=f.getId();
                if(ManageclientThread.hm.containsKey(userid))//查询在线好友
                {
                    UserThread getter=ManageclientThread.getClientThread(userid);
                    ObjectOutputStream onlinemaasage=new ObjectOutputStream(getter.client.getOutputStream());
                    massage m=new massage();
                    m.setType("5");
                    m.setSender(ID);
                    onlinemaasage.writeObject(m);
                    System.out.println("上线信息发送成功");
                }
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        while (true)
        {
            try {
                massage m=(massage)mobjin.readObject();
                if(m.gettype().equals("1"))//普通对话信息
                {
                    System.out.println(m.getSender()+"给"+m.getGetter()+"说"+m.getTextmassage());
                UserThread getter=ManageclientThread.getClientThread(m.getGetter());
               try{
                  mobjout=new ObjectOutputStream(getter.client.getOutputStream());
                   System.out.println("成功找出线程 接收者:"+getter.ID);
                   mobjout.writeObject(m);
                   System.out.println("成功转发");
               }catch (Exception e){
                   e.printStackTrace();
               }
                }
               if(m.gettype().equals("3"))//添加好友消息
              {
                  if(MassageUser.userhashmap.containsKey(m.getGetter())){System.out.println("添加好友请求");
                      m.setFriendname(MassageUser.getUser(m.getGetter()).getUsername());
                      System.out.println("要添加的好友是:"+m.getFriendname());
                      File friendfile=new File(m.getSender()+".obj");
                      System.out.println(friendfile.getAbsolutePath());
                      try{
                          FileInputStream flistin=new FileInputStream(friendfile);
                          ObjectInputStream flistobjin=new ObjectInputStream(flistin);
                          Friendslist friendslist=(Friendslist) flistobjin.readObject();
                          System.out.println("成功读取好友列表");

                          Collection values = friendslist.getFriends().values();  //获取Map集合的value集合
                          for(Object object:values){
                              Friend f=(Friend) object;
                              System.out.println("键值:"+f.getId());  //输出键值对象
                          }
                          System.out.println(friendslist.getOwner());
                          System.out.println(friendslist.getOwername());
                          System.out.println(friendslist.getFriends().size());
                          Friend f=new Friend();
                          f.setId(m.getGetter());
                          f.setName(m.getFriendname());
                          friendslist.addFriend(m.getGetter(),f);
                          System.out.println("存入哈希表成功");
                          System.out.println(friendslist.getFriends().size());
                          flistobjin.close();
                          FileOutputStream flistout=new FileOutputStream(friendfile);
                          ObjectOutputStream flistobjout=new ObjectOutputStream(flistout);
                          flistobjout.writeObject(friendslist);
                          flistobjout.flush();
                          flistobjout.close();
                      }catch (Exception e)
                      {
                          e.printStackTrace();
                      }

                      File friendfilegetter=new File(m.getGetter()+".obj");
                      System.out.println(friendfile.getAbsolutePath());
                      try{

                          FileInputStream flistin2=new FileInputStream(friendfilegetter);
                          ObjectInputStream flistobjin2=new ObjectInputStream(flistin2);
                          Friendslist friendslist2=(Friendslist) flistobjin2.readObject();

                          System.out.println("成功读取好友列表");
                          System.out.println(friendslist2.getOwner());
                          System.out.println(friendslist2.getOwername());
                          System.out.println(friendslist2.getFriends().size());
                          Friend f=new Friend();
                          f.setId(m.getSender());
                          f.setName(MassageUser.getUser(m.getSender()).getUsername());
                          friendslist2.addFriend(m.getSender(),f);
                          System.out.println(friendslist2.getFriends().size());
                          flistobjin2.close();
                          FileOutputStream flistout2=new FileOutputStream(friendfilegetter);
                          ObjectOutputStream flistobjout2=new ObjectOutputStream(flistout2);
                          flistobjout2.writeObject(friendslist2);
                          flistobjout2.flush();
                          flistobjout2.close();
                      }catch (Exception e)
                      {
                          e.printStackTrace();
                      }
                      try{
                          if(ManageclientThread.hm.containsKey(m.getGetter())){
                              m.setOnline(true);
                              UserThread getter=ManageclientThread.getClientThread(m.getGetter());
                              ObjectOutputStream onlinemaasage=new ObjectOutputStream(getter.client.getOutputStream());
                              onlinemaasage.writeObject(m);
                          }
                          ObjectOutputStream objouts=new ObjectOutputStream(client.getOutputStream());
                          objouts.writeObject(m);
                      }catch (Exception e){
                          e.printStackTrace();
                      }
                      System.out.println("好友请求回复发送成功");
                  }
                  else{
                           m.setType("0");
                      try{
                          ObjectOutputStream objouts=new ObjectOutputStream(client.getOutputStream());
                          objouts.writeObject(m);
                          System.out.println("好友添加失败");
                      }catch (Exception e){
                          e.printStackTrace();
                      }
                  }
              }
                if(m.gettype().equals("4"))//删除好友
                {
                    File friendfile1=new File(m.getSender()+".obj");
                    System.out.println(friendfile1.getAbsolutePath());
                    try {
                        FileInputStream flistin1 = new FileInputStream(friendfile1);
                        ObjectInputStream flistobjin1 = new ObjectInputStream(flistin1);
                        Friendslist friendslist1 = (Friendslist) flistobjin1.readObject();
                        System.out.println("成功读取好友列表");
                        friendslist1.removeFriend(m.getGetter());
                        flistobjin1.close();
                        FileOutputStream flistout1=new FileOutputStream(friendfile1);
                        ObjectOutputStream flistobjout1 = new ObjectOutputStream(flistout1);
                        flistobjout1.writeObject(friendslist1);
                        flistobjout1.flush();
                        flistobjout1.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    File friendfile2 = new File(m.getGetter() + ".obj");
                    try {
                        FileInputStream flistin2 = new FileInputStream(friendfile2);
                        ObjectInputStream flistobjin2 = new ObjectInputStream(flistin2);
                        Friendslist friendslist2 = (Friendslist) flistobjin2.readObject();
                        System.out.println("成功读取好友列表");
                        friendslist2.removeFriend(m.getSender());
                        flistobjin2.close();
                        FileOutputStream flistout2 = new FileOutputStream(friendfile2);
                        ObjectOutputStream flistobjout2 = new ObjectOutputStream(flistout2);
                        flistobjout2.writeObject(friendslist2);
                        flistobjout2.flush();
                        flistobjout2.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        ObjectOutputStream objouts = new ObjectOutputStream(client.getOutputStream());
                        objouts.writeObject(m);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            } catch (Exception e) {


                File friend_file_ = new File(ID + ".obj");
                System.out.println(friend_file_.getAbsolutePath());
                try {
                    FileInputStream flist_in = new FileInputStream(friend_file_);
                    ObjectInputStream flistobj_in = new ObjectInputStream(flist_in);
                    Friendslist friends_list = (Friendslist) flistobj_in.readObject();
                    System.out.println("成功读取好友列表");
                    Online onlinelist = new Online();
                    Collection Values = friends_list.getFriends().values();  //获取Map集合的value集合
                    for (Object object : Values) {
                        Friend f = (Friend) object;
                        String userid = f.getId();
                        if (ManageclientThread.hm.containsKey(userid))//查询在线好友
                        {
                            UserThread getter = ManageclientThread.getClientThread(userid);
                            ObjectOutputStream onlinemaasage = new ObjectOutputStream(getter.client.getOutputStream());
                            massage m = new massage();
                            m.setType("6");
                            m.setSender(ID);
                            onlinemaasage.writeObject(m);
                            System.out.println("下线信息发送成功");
                        }
                    }
                } catch (Exception x) {

                    x.printStackTrace();
                }


                System.out.println("线程错误");
                ManageclientThread.hm.remove(ID);
                System.out.println("进程哈希表个数" + ManageclientThread.hm.size());
                break;
            }
        }
    }
}

当前已注册用户:

package server_model;

import java.util.HashMap;
import common.*;
public class MassageUser {
    public static HashMap userhashmap=new HashMap<String, User>();
    public static void addUser(String ID, common.User u)
    {

        userhashmap.put(ID,u);
        System.out.println("用户成功存入哈希表");
    }
    public static User getUser(String ID)
    {
        return (User)userhashmap.get(ID);
    }


}

当前在线用户:

package server_model;

import java.util.HashMap;

public class ManageclientThread {
    public static HashMap hm=new HashMap<String, UserThread>();
    public static void addClientThread(String ID, UserThread ct)
    {

        hm.put(ID,ct);
        System.out.println("线程成功存入哈希表");
    }
    public static UserThread getClientThread(String ID)
    {
        return (UserThread)hm.get(ID);
    }
    public static void removeClientThread(String ID)
    {
        hm.remove(ID);
    }
}

服务器与客户端共有类:用于实现信息封装方便对象通过网络传输。存放于服务器项目与客户端项目的common包中。

1.好友类

package common;

public class Friend implements java.io.Serializable{
   private String id;
   private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

好友列表类:

package common;

import java.util.HashMap;

public class Friendslist implements java.io.Serializable {

    private String loginsign;
    private String owner;
    private HashMap friends;
    private String owername;

    public Friendslist(String id) {
        friends = new HashMap<String, Friend>();
        owner = id;
    }

    public void addFriend(String ID, Friend f) {

        friends.put(ID, f);
        System.out.println("好友成功存入哈希表");
    }

    public void removeFriend(String id) {
        friends.remove(id);
    }

    public HashMap getFriends() {
        return friends;
    }

    public String getOwner() {
        return owner;
    }

    public String getLoginsign() {
        return loginsign;
    }

    public void setLoginsign(String loginsign) {
        this.loginsign = loginsign;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getOwername() {
        return owername;
    }

    public void setOwername(String owername) {
        this.owername = owername;
    }
}

 消息类:

package common;

public class massage implements java.io.Serializable {
    private String type;
    private String sender;
    private String getter;
    private String textmassage;
    private String friendname;
    private String sendername;
    private boolean geteronline = false;
    private String sendtime;

    public String getSendername() {
        return sendername;
    }

    public void setSendername(String sendername) {
        this.sendername = sendername;
    }

    public boolean isOnline() {
        return geteronline;
    }

    public void setOnline(boolean online) {
        this.geteronline = online;
    }

    public String getType() {
        return type;
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getGetter() {
        return getter;
    }

    public void setGetter(String getter) {
        this.getter = getter;
    }

    public String getTextmassage() {
        return textmassage;
    }

    public void setTextmassage(String textmassage) {
        this.textmassage = textmassage;
    }

    public String getSendtime() {
        return sendtime;
    }

    public void setSendtime(String sendtime) {
        this.sendtime = sendtime;
    }

    public void setType(String s) {

        this.type = s;
    }

    public String gettype() {
        return type;
    }

    public String getFriendname() {
        return friendname;
    }

    public void setFriendname(String friendname) {
        this.friendname = friendname;
    }
}

用户登录验证类:

package common;
public class User implements java.io.Serializable {
    private String userid;
    private String password;
    private String username;
private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserid() {
        return userid;
    }

    public String getPassword() {
        return password;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

好友在线提醒类:

package common;

import java.util.HashMap;

public class Online implements java.io.Serializable{
    public HashMap onlinelist;
    public Online() {
       onlinelist=new HashMap<String,String>();
    }
    public  void addFriend(String id, String ID )
    {
        onlinelist.put(ID,id);
    }

    public HashMap getOnlinelist() {
        return onlinelist;
    }
}

本项目中将服务器与客户端分成两个项目来进行编写。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值