客户端代码:
界面代码:存放于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;
}
}
本项目中将服务器与客户端分成两个项目来进行编写。