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

📄 serve.java

📁 是一个JAVA通讯程序.功能不多
💻 JAVA
字号:
package server;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Locale;
import java.util.Vector;
import javax.swing.JOptionPane;

import setting.Embody;
import setting.User;

class Serve
{
	/**
	 * 定义ServerSocket
	 */
	private ServerSocket serversocket;

	/**
	 * 定义Socket 当有客户连接到服务器时创建一个新的Socket
	 */
	private Socket socket = new Socket();

	/**
	 * 是否有线程正在访问文件
	 */
	private boolean isVisitFile = true;

	/**
	 * 定义线程类
	 */
	private Work work;

	/**
	 * 聚集:用于保存客户所有信息
	 */
	@SuppressWarnings("unchecked")
	private ArrayList arraylist = null;

	/**
	 * 服务器监控UI
	 */
	ServerUI serverUI;

	/**
	 * 定义Server类
	 */
	static Serve serve = null;

	/**
	 * 定义保存线程及用户信息对象类
	 */
	@SuppressWarnings("unchecked")
	private Vector clientsfind = null;

	/**
	 * 获取服务器IP
	 */
	public static InetAddress getLocalHost() throws UnknownHostException
	{
		InetAddress IP = InetAddress.getLocalHost();
		return IP;
	}
	/**
	 * 启动服务器
	 */
	public void start()
	{
		try{   
				serversocket = new ServerSocket(setting.Command.server_port);
				serverUI = new ServerUI();
				serverUI.getJFrame();
				serverUI.setShowTextArea(true);
				serverUI.setShowTextArea1(false);
				serverUI.layout.first(serverUI.jPaneShowTextArea);
				serverUI.getJTextArea().append(Serve.getTime() + "服务器启动" 
						+ "\n" + "服务器IP是:" + (getLocalHost().getHostAddress() ) + "\n");	
				socket.close();
		} 
		  catch (IOException e)
		{
			JOptionPane.showMessageDialog(null,"此端口被占用,系统将退出"); // 出错,打印出错信息
			System.exit(0);
		} catch (Exception e)
		{		
			e.printStackTrace();
		}
	}
	/**
	 * 启动线程
	 */
	public void startThread()
	{
		while (true)// 死循环 一直监听有没有客户端和服务器建立连接
		{
			try
			{
				socket = serversocket.accept();
				serverUI.setShowTextArea(true);
				serverUI.setShowTextArea1(false);
				serverUI.layout.first(serverUI.jPaneShowTextArea);
				serverUI.getJTextArea().append(
						Serve.getTime() + "客户端开始连接服务器:" + "\n" );
				serverUI.getJTextArea().selectAll();
				work = new Work(serve, socket);// 通过Server的对象 和 连接入的Socket
				// 对象构造Work
				work.start();// 启动线程;
			} catch (IOException e)
			{
				e.printStackTrace();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	/**
	 * 注册新用户
	 */
	@SuppressWarnings("unchecked")
	public synchronized void addNewUser(User user)
	{
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			if (!new File(setting.Command.userdatebase).exists())
			{
				new File(setting.Command.userdatebase);// 若用户数据文件不在则创建用户数据文件
			}
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(setting.Command.userdatebase, false));
			// 创建对象输出流
			// 以后写进来的信息覆盖原来的信息
			if (user.getID() == 1000)// 仅在服务器接受第一个客户注册时实例化
			{
				arraylist = new ArrayList();
			}
			arraylist.add(user);// 将从客户传进来的user信息添加到 arraylist中
			out.writeObject(arraylist);// 将arrylist对象写入文件中
			out.flush();
			out.close();
			isVisitFile = true;
			notifyAll();
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			Ioe.printStackTrace();
		} catch (Exception e)
		{
			System.out.println("异常:" + e.getMessage());
		} // 捕获一切可能的异常
	}

	/**
	 * 读取用户数据文件到arraylist到内存中
	 */
	@SuppressWarnings("unchecked")
	public synchronized void readUserDB()
	{
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					setting.Command.userdatebase));
			arraylist = new ArrayList();
			arraylist = (ArrayList) in.readObject();
			in.close();
			isVisitFile = true;
			notifyAll();
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			Ioe.printStackTrace();
		} catch (Exception e)
		{
			System.out.println("异常:" + e.getMessage());
		} // 捕获一切可能的异常
	}

	/**
	 * 根据用户ID在数据库中找到相应User对象
	 */
	@SuppressWarnings("unchecked")
	public synchronized User readUserDBbyID(int userid)
	{
		User readuser = new User();
		boolean isExist = false;
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					setting.Command.userdatebase));
			arraylist = new ArrayList();
			arraylist = (ArrayList) in.readObject();
			Iterator iter = arraylist.iterator();
			while (iter.hasNext())
			{
				readuser = (User) iter.next();
				if (readuser.getID() == userid)
				{
					isExist = true;
					break;// 从数据库中再次读取用户
				}
			}
			if (!isExist)
			{
				readuser = new User();
				readuser.setID(0);
			}
			in.close();
			isVisitFile = true;
			notifyAll();
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			System.out.println("读写错误:" + Ioe.getMessage());
		} catch (Exception e)
		{
			System.out.println("异常:" + e.getMessage());
		} // 捕获一切可能的异常
		return readuser;
	}

	/**
	 * 保存用户信息
	 */
	@SuppressWarnings("unchecked")
	public synchronized void saveDB(User user)
	{
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(setting.Command.userdatebase));
			User saveuser = new User();
			Iterator iter = serve.getArrayList().iterator();
			while (iter.hasNext())
			{
				saveuser = (User) iter.next();
				if (user.getID() == saveuser.getID())
				{
					iter.remove();
					break;
				}
			}
			arraylist.add(user);
			out.writeObject(arraylist);
			out.flush();
			out.close();
			isVisitFile = true;
			notifyAll();
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			System.out.println("读写异常:" + Ioe.getMessage());
		} catch (Exception e)
		{
			System.out.println("异常:" + e.getMessage());
		}
	}

	/**
	 * 删除用户信息 user为用户号码 friendid为将要被删除的好友的号
	 */
	@SuppressWarnings("unchecked")
	public synchronized boolean delfriend(User user, int friendid)
	{
		boolean delsuccess = false;
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					setting.Command.userdatebase));
			arraylist = new ArrayList();
			arraylist = (ArrayList) in.readObject();
			Iterator iter = arraylist.iterator();
			User deluser = new User();
			while (iter.hasNext())
			{
				deluser = (User) iter.next();
				if (user.getID() == deluser.getID())
				{
					break;
				}
			}
			User userfriend = new User();
			for (int i = 0; i < deluser.getFriend().size(); i++)
			{
				userfriend = (User) deluser.getFriend().elementAt(i);// 遍历得到朋友的ID
				if (userfriend.getID() == friendid)
				{
					deluser.getFriend().removeElementAt(i);
					delsuccess = true;
					break;
				}
			}
			in.close();
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(setting.Command.userdatebase));
			out.writeObject(arraylist);
			out.close();
			isVisitFile = true;
			System.out.println("读取数据");
			notifyAll();
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			System.out.println("读写错误:" + Ioe.getMessage());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return delsuccess;
	}
	/**
	 * 服务器入口
	 */
	public static void main(String[] args)
	{
		serve = new Serve();
		serve.start();// 启动服务器
		serve.startThread();// 等待客户连接 创建线程
	}

	/**
	 * 返回以生成的ArrayList对象
	 */
	@SuppressWarnings("unchecked")
	public ArrayList getArrayList()
	{
		return this.arraylist;
	}

	/**
	 * 返回以生成的ServerUI对象
	 */
	public ServerUI getServerUI()
	{
		return this.serverUI;
	}

	/**
	 * 从数据库读出数据,修改用户信息并保存数据库文件
	 */
	@SuppressWarnings("unchecked")
	public synchronized void modifyUserInfo(User user)
	{
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					setting.Command.userdatebase));
			arraylist = new ArrayList();
			arraylist = (ArrayList) in.readObject();
			Iterator iter = arraylist.iterator();
			while (iter.hasNext())
			{
				User user2 = (User) iter.next();
				if (user.getID() == user2.getID())
				{
					iter.remove();// 在迭代器上的修改会导致arraylist的修改
				}
			}
			arraylist.add(user);
			in.close();
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(setting.Command.userdatebase));
			out.writeObject(arraylist);
			out.flush();
			out.close();
			notifyAll();
			isVisitFile = true;
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (FileNotFoundException Filenot)
		{
			System.out.println("文件错误:" + Filenot.getMessage());
		} catch (IOException Ioe)
		{
			Ioe.printStackTrace();
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * 用户是否在线
	 */
	@SuppressWarnings("unchecked")
	public boolean isOnline(User userInfo)
	{
		Iterator iter = serve.getArrayList().iterator();
		User user = new User();//
		boolean isOnline = true;
		while (iter.hasNext())
		{
			user = (User) iter.next();// user是在数据库中找到的对象
			if (userInfo.getID() == user.getID())
			{
				if (user.getStatus() == 0)
				{
					isOnline = true;
				}
				if (user.getStatus() == 1)
				{
					isOnline = false;
				}
			}
		}
		isVisitFile = true;
		return isOnline;
	}

	/**
	 * 保存用户登录时的User和Work对象
	 */
	@SuppressWarnings("unchecked")
	public void saveWorkAndUser(User user)
	{
		UserInfoAndThread userself = new UserInfoAndThread();
		userself.setWorking(work);
		userself.setUser(user);
		if (clientsfind == null)
		{
			clientsfind = new Vector();
		}
		clientsfind.add(userself);
	}

	/**
	 * 根据指定ID寻找线程并向网络发送信息
	 */
	public synchronized void sendpersonal(int id, Embody objMsg)// 根据用户ID发送
	{
		try
		{
			if (!isVisitFile)
			{
				wait();
			}
			isVisitFile = false;
			for (int i = 0; i < clientsfind.size(); i++)
			{
				UserInfoAndThread client = new UserInfoAndThread();
				// 分别得到每个客户端的连接
				client = (UserInfoAndThread) clientsfind.elementAt(i); 
				if (client.getUser().getID() == id)
				{
					client.getWorking().send(objMsg);
					// 由目标ID得到目标线程
				}
			}
		} catch (InterruptedException Interr)
		{
			System.out.println("错误:" + Interr.getMessage());
		} catch (Exception e)
		{
			System.out.println("异常:" + e.getMessage());
		}
		isVisitFile = true;
		notifyAll();
	}
	
	/**
	 * 得到当前时间
	 */
	public static String getTime()
	{
		Calendar calendar = GregorianCalendar.getInstance(Locale.getDefault());
		Date date = calendar.getTime();// 得到当前时间
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return formatter.format(date);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -