⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myserver.java

📁 JAVA聊天室 本聊天室可以实现公聊和私聊
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -