📄 myserver.java
字号:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.Vector;
import javax.swing.border.*;
class UserData implements Serializable{
String id;
String pwd;
String name;
String sex;
String age;
String phone;
String mail;
public UserData(String id,String pwd,String name,String sex,String age,String phone,String mail)
{
this.id = id;
this.pwd = pwd;
this.name = name;
this.sex = sex;
this.age = age;
this.phone = phone;
this.mail = mail;
}
}
class PrivateUser implements Serializable
{
Socket socket;
String name;
String id;
public PrivateUser(Socket socket,String id,String name)
{
this.socket = socket;
this.id = id;
this.name = name;
}
}
public class MyServer implements ActionListener,Runnable
{
JFrame frm;
JPanel p;
JTextArea txtA;
JButton btnStart,btnClose,btnUser;
JLabel lblMsg;
ServerSocket sskt;
MyMsgBox msgBox;
Online online;
Vector vUsd,userSkt;
Font fn = new Font("宋体",0,15);
Color red = Color.red;
public MyServer()
{
frm = new JFrame("聊天室服务器");
p = new JPanel();
p.setLayout(null);
msgBox = new MyMsgBox();
online = new Online();
vUsd = new Vector();
userSkt = new Vector();
txtA = new JTextArea(10,30);
txtA.setLineWrap(true); //自动换行
txtA.setEditable(false);
txtA.setForeground(Color.blue);
txtA.setFont(fn);
JScrollPane sp = new JScrollPane(txtA); //加滚动条
sp.setBounds(5,5,335,150);
p.add(sp);
btnStart = new JButton("启动");
btnStart.setBounds(5,160,80,30);
btnStart.setFont(fn);
p.add(btnStart);
btnClose = new JButton("停止");
btnClose.setBounds(260,160,80,30);
btnClose.setFont(fn);
p.add(btnClose);
btnUser = new JButton("帐号管理");
btnUser.setBounds(125,160,100,30);
btnUser.setFont(fn);
p.add(btnUser);
btnClose.setEnabled(false);
lblMsg = new JLabel("",JLabel.CENTER);
lblMsg.setForeground(Color.red);
Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED); //加边框
lblMsg.setBorder(border);
lblMsg.setFont(fn);
lblMsg.setBounds(5,195,335,30);
p.add(lblMsg);
btnStart.addActionListener(this);
btnClose.addActionListener(this);
btnUser.addActionListener(this);
frm.getContentPane().add(p);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(350,255);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frm.getSize();
frm.setLocation((screenSize.width - frameSize.width)/2,(screenSize.height - frameSize.height)/2);
frm.setResizable(false);
frm.setVisible(true);
}
public void run()
{
while(sskt != null)
{
try
{
Socket socket = sskt.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
Input ip = new Input(ois,oos,socket);
ip.start();
PublicMsg pm = new PublicMsg(oos);
pm.start();
PrivateMsg ppm = new PrivateMsg(oos,socket);
ppm.start();
OutputUser opu = new OutputUser(oos);
opu.start();
DelUser du = new DelUser(oos);
du.start();
}
catch(Exception e)
{
System.out.println(e.toString());
break;
}
}
}
public void actionPerformed(ActionEvent evt)
{
try
{
JButton bt = (JButton)evt.getSource();
if(bt.equals(btnStart))
{
sskt = new ServerSocket(1986);
Thread thd = new Thread(this);
thd.start();
lblMsg.setText("服务器运行中....");
btnStart.setEnabled(false);
btnClose.setEnabled(true);
}
else if(bt.equals(btnClose))
{
sskt.close();
lblMsg.setText("服务器停止运行!");
btnStart.setEnabled(true);
btnClose.setEnabled(false);
}
else if(bt.equals(btnUser))
{
new UserFrm();
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
class Input extends Thread //Input
{
ObjectInputStream ois;
ObjectOutputStream oos;
Socket socket;
String name;
public Input(ObjectInputStream in,ObjectOutputStream out,Socket skt)
{
try
{
socket = skt;
ois = in;
oos = out;
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
public void run()
{
try
{
while(ois != null)
{
String ms = (String)ois.readObject();
if(ms.equals("Enrol")) //注册
{
UserData usr = (UserData)ois.readObject();
String userId = usr.id;
FileInputStream fis = new FileInputStream("userdata.txt");
ObjectInputStream oisUser = new ObjectInputStream(fis);
Vector vctUser = (Vector)oisUser.readObject();
oisUser.close();
fis.close();
int k=0;
for(;k<vctUser.size();k++)
{
UserData user = (UserData)vctUser.elementAt(k);
String strId = user.id;
if(strId.equals(userId))
{
oos.writeObject(new String("EnrolFalse"));
break;
}
}
if(k >= vctUser.size())
{
vctUser.addElement(usr);
FileOutputStream fos = new FileOutputStream("userdata.txt");
ObjectOutputStream oosUser = new ObjectOutputStream(fos);
oosUser.writeObject(vctUser);
oosUser.close();
fos.close();
oos.writeObject(new String("EnrolOK"));
}
}
else if(ms.equals("Login")) //登陆
{
String id = (String)ois.readObject();
String pwd = (String)ois.readObject();
FileInputStream fis = new FileInputStream("userdata.txt");
ObjectInputStream oisUser = new ObjectInputStream(fis);
Vector vctUser = (Vector)oisUser.readObject();
oisUser.close();
fis.close();
int i=0;
for(;i<vctUser.size();i++)
{
UserData userData = (UserData)vctUser.elementAt(i);
String userId = userData.id;
String userPWD = userData.pwd;
if(userId.equals(id) && userPWD.equals(pwd))
{
oos.writeObject(new String("LoginOK"));
oos.writeObject(userData);
vUsd.addElement(userData);
String userName = userData.name;
PrivateUser pu = new PrivateUser(socket,userId,userName);
userSkt.addElement(pu);
online.addUser(userName);
name = userName;
break;
}
}
if(i >= vctUser.size())
{
oos.writeObject(new String("LoginFalse"));
}
}
else if(ms.equals("Setting")) //个人设置
{
UserData md = (UserData)ois.readObject();
String uId = md.id;
FileInputStream fis = new FileInputStream("userdata.txt");
ObjectInputStream oisUser = new ObjectInputStream(fis);
Vector vctUser = (Vector)oisUser.readObject();
oisUser.close();
fis.close();
for(int j=0;j<vctUser.size();j++)
{
UserData usd = (UserData)vctUser.elementAt(j);
String userId = usd.id;
if(userId.equals(uId))
{
vctUser.remove(usd);
vctUser.addElement(md);
FileOutputStream fos = new FileOutputStream("userdata.txt");
ObjectOutputStream oosUser = new ObjectOutputStream(fos);
oosUser.writeObject(vctUser);
oosUser.close();
fos.close();
oos.writeObject("SettingOK");
break;
}
}
}
else if(ms.equals("PublicMsg")) //接收信息
{
String ss = (String)ois.readObject();
txtA.append(ss + "\r\n");
msgBox.addMsg(ss);
}
else if(ms.equals("PrivateMsg"))
{
Vector vms = (Vector)ois.readObject();
//vms.addElement(name);
String mss = (String)ois.readObject();
msgBox.addPraUs(vms,mss);
}
}
}
catch(SocketException ske)
{
online.delUser(name);
for(int r=0;r<userSkt.size();r++)
{
PrivateUser ppu = (PrivateUser)userSkt.elementAt(r);
if(name.equals(ppu.name))
{
userSkt.remove(ppu);
break;
}
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
//***************************************************************账户管理窗口
class UserFrm extends JFrame implements ActionListener
{
JPanel pData,pBtn,pBtn2,pOnline;
JTabbedPane tp;
JButton btnAdd,btnDel,btnClose;
JTable tabData,tabOnline;
BorderLayout bl,bl2;
TableColumn tc,tc2;
Font font = new Font("宋体",Font.PLAIN,13);
public UserFrm()
{
super("帐号管理");
pData = new JPanel();
pBtn = new JPanel();
pBtn2 = new JPanel();
pOnline = new JPanel();
bl = new BorderLayout();
bl2 = new BorderLayout();
pData.setLayout(bl);
pOnline.setLayout(bl2);
tp = new JTabbedPane(SwingConstants.TOP);
tp.setFont(font);
enroledTab();
onlineTab();
btnAdd.addActionListener(this);
btnDel.addActionListener(this);
btnClose.addActionListener(this);
this.getContentPane().add(tp,BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setSize(800,500);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
this.setLocation((screenSize.width - frameSize.width)/2,(screenSize.height - frameSize.height)/2);
this.setResizable(false);
this.setVisible(true);
}
public void enroledTab()
{
String[] title = {"帐号","密码","呢称","性别","年龄","电话","E-Mail"};
String temp[][] = new String[100][7];
tabData = new JTable(temp,title);
JScrollPane spData = new JScrollPane(tabData);
tabData.setBackground(Color.darkGray);
tabData.setForeground(Color.white);
UserData usr;
Vector userList = new Vector();
try //从文件中读出数据并显示在表格中
{
FileInputStream fis = new FileInputStream("UserData.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
userList = (Vector)ois.readObject();
for(int i=0;i<userList.size();i++)
{
usr = (UserData)userList.elementAt(i);
temp[i][0] = usr.id;
temp[i][1] = usr.pwd;
temp[i][2] = usr.name;
temp[i][3] = usr.sex;
temp[i][4] = usr.age;
temp[i][5] = usr.phone;
temp[i][6] = usr.mail;
for(int k=0;k<7;k++)
{
tabData.setValueAt(temp[i][k],i,k); //把数据显示在表格中
}
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
tc = tabData.getColumnModel().getColumn(0); //获取表格的第1列
tc.setPreferredWidth(80); //设置第1列的宽度
tc = tabData.getColumnModel().getColumn(1);
tc.setPreferredWidth(80);
tc = tabData.getColumnModel().getColumn(2);
tc.setPreferredWidth(80);
tc = tabData.getColumnModel().getColumn(3);
tc.setPreferredWidth(30);
tc = tabData.getColumnModel().getColumn(4);
tc.setPreferredWidth(30);
tc = tabData.getColumnModel().getColumn(5);
tc.setPreferredWidth(80);
tc = tabData.getColumnModel().getColumn(6);
tc.setPreferredWidth(100);
btnAdd = new JButton("添加用户");
btnAdd.setFont(font);
btnDel = new JButton("删除用户");
btnDel.setFont(font);
btnClose=new JButton("关闭程序");
btnClose.setFont(font);
pBtn.add(btnAdd);
pBtn.add(btnDel);
pBtn.add(btnClose);
pData.add("Center",spData);
pData.add("South",pBtn);
tp.addTab("已注册的用户",pData);
}
public void onlineTab()
{
String[] ti={"帐号","呢称","性别","年龄","电话","E-Mail"};
String tm[][] = new String[50][7];
tabOnline = new JTable(tm,ti);
JScrollPane spOnline = new JScrollPane(tabOnline);
tabOnline.setBackground(Color.darkGray);
tabOnline.setForeground(Color.white);
UserData usd;
try
{
for(int i=0;i<vUsd.size();i++)
{
usd = (UserData)vUsd.elementAt(i);
tm[i][0] = usd.id;
tm[i][1] = usd.name;
tm[i][2] = usd.sex;
tm[i][3] = usd.age;
tm[i][4] = usd.phone;
tm[i][5] = usd.mail;
for(int k=0;k<6;k++)
{
tabOnline.setValueAt(tm[i][k],i,k);
}
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
tc2 = tabOnline.getColumnModel().getColumn(0);
tc2.setPreferredWidth(80);
tc2 = tabOnline.getColumnModel().getColumn(1);
tc2.setPreferredWidth(80);
tc2 = tabOnline.getColumnModel().getColumn(2);
tc2.setPreferredWidth(30);
tc2 = tabOnline.getColumnModel().getColumn(3);
tc2.setPreferredWidth(20);
tc2 = tabOnline.getColumnModel().getColumn(4);
tc2.setPreferredWidth(80);
tc2 = tabOnline.getColumnModel().getColumn(5);
tc2.setPreferredWidth(100);
pOnline.add("Center",spOnline);
tp.addTab("在线用户",pOnline);
}
public void actionPerformed(ActionEvent evt)
{
JButton jb = (JButton)evt.getSource();
if(jb.equals(btnAdd))
{
new AddUserDil(this);
}
else if(jb.equals(btnDel))
{
new DilDel(this);
}
else if(jb.equals(btnClose))
{
this.setVisible(false);
}
}
}
//***********************************************************************End
//*****************************************************************删除对话框
class DilDel extends JDialog implements ActionListener
{
JLabel lblInf;
JTextField txtIn;
JButton btnOK,btnCancel;
public DilDel(UserFrm uf)
{
super(uf,"删除用户",true);;
lblInf = new JLabel("请输入要删除的用帐号");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -