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

📄 work.java

📁 是一个JAVA通讯程序.功能不多
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package server;

import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Iterator;

import setting.Embody;
import setting.User;

public class Work extends Thread{
	/**
	 * 定义变量
	 */
	public int id;
	/**
	 * 定义对象输入流
	 */
	private ObjectInputStream netIn=null;
	/**
	 * 定义对象输出流
	 */
	private ObjectOutputStream netOut=null;
	/**
	 * 定义Socket
	 */
	private Socket socket=null;
	/**
	 * 接收网络信息标志
	 */
	private boolean runFlag=true;
	/**
	 * 定义Server对象
	 */
	private Serve serve=new Serve();

	/**
	 * 构造函数
	 */
	Work(Serve serve,Socket socket) throws IOException
	{

		this.serve = serve;
		this.socket=socket;
		netIn = new ObjectInputStream(socket.getInputStream());
		netOut = new ObjectOutputStream(socket.getOutputStream());	
	}
	/**
	 * 线程主体
	 */
	public  void run() {


		while (runFlag) {
			receive();	//始终接受来自客户的信令,除非用户退出
		}

	}
	/**
	 * 向网络发送消息
	 */
	public void send(Embody objMsg)
	{

		try{
			netOut.writeObject(objMsg);
			netOut.flush();
		}catch(IOException e){
			System.out.println("发送异常"+e.getMessage());
		}
	}
	/**
	 * 接收信令,调用chatProtocol
	 */
	@SuppressWarnings("deprecation")
	public void receive()
	{
		Embody objMsg = new Embody();
		try
		{
			if ((objMsg = (Embody) netIn.readObject()) != null)
			{
			
				serve.serverUI.setShowTextArea(true);
				serve.serverUI.setShowTextArea1(false);
				serve.serverUI.layout.first(serve.serverUI.jPaneShowTextArea);
				serve.serverUI.getJTextArea().append(
						Serve.getTime() + "处理用户请求:" + objMsg.getOrder()
								+ "\n");
				serve.serverUI.getJTextArea().selectAll();
				chatProtocol(objMsg);
			}
		} catch (IOException e)
		{
			System.out.println("IO异常");
			stop();// 终止正在运行的线程
		} 
		catch (ClassNotFoundException e)
		{
			System.out.println("找不到这个类");
		}
	}

	/**
	 * 接受信令,调用Work接收信令的
	 *  注册新用户 
	 *  聊天 
	 *  用户登录 
	 *  添加好友
	 *  发送企业消息
	 *  消息签收
	 *  删除好友
	 *  修改个人信息
	 *  检查是否有留言 
	 *  检查用户是否在线方法
     *  关闭连接发送离线消息
	 */
	public void chatProtocol(Embody objMsg)
	{

		registerNewUser(objMsg);
		login(objMsg);
		addFriend(objMsg);
		modifyUserInfo(objMsg);
		closeConn(objMsg);//
		personchat(objMsg);//聊天
		Inerchat(objMsg);//消息签收
		Inerchatflish(objMsg);//验证
		checkliuyan(objMsg);
		delfriend(objMsg);
		checkfriendstatus(objMsg);
		checkFreindInfo(objMsg);
		checkFreindIP(objMsg);
	}
	
	/**
	 * 接收用户登陆相关信令
	 */

	public void login(Embody objMsg){

		String order=objMsg.getOrder();//得到信令
		if(order.equals(setting.Command.login))
		{
			User user=new User();//保存从客户端传来的号码和密码
			User userInfo=new User();//保存从数据库读出的USER对象
			user=(User)objMsg.getObjMessage();//传来的只有号码和密码
			System.out.println("用户登陆");
			if(!new File(".\\UserDB.db").exists())
      //若用户数据库不存在则返回给客户密码错误消息
			{
				objMsg.setOrder(setting.Command.loginfail);//设置反馈给客户登录失败的信令
				send(objMsg);
				return;
			}

				userInfo=serve.readUserDBbyID(user.getID());//根据号码读取
				if(userInfo.getID()==user.getID()&&userInfo.getPassword().equals(user.getPassword()))
				{//判断所传来的ID和密码是否相等
					serve.saveWorkAndUser(userInfo);
          //把此用户存在USERINFO中用与和其他客户交互时 查询相关线程
					//主要是为了获取ID
					if(serve.isOnline(userInfo))//判断此用户是否登录 在线则返回真
					{
						objMsg.setSourceID(userInfo.getID());
						objMsg.setDestID(userInfo.getID());
						objMsg.setOrder(setting.Command.loginreapt);
						send(objMsg);
						return;//若登录了则返回
					}
					userInfo.setIP(user.getIP());
					userInfo.setOnline();//将用户设置为在线状态
					serve.modifyUserInfo(userInfo);
					//保存以后再看用户的状态是否修改
					objMsg.setOrder(setting.Command.loginsuccess);//发给客服注册成功的信令
					objMsg.setObjMessage(userInfo);//把此用户的信息反馈给客服端
					send(objMsg);
					serve.serverUI.getJTextArea().append(Serve.getTime()+"用户验证成功"+String.valueOf(userInfo.getID())+"连入服务器"+"\n");
				
				}else
				{
					//密码不正确
					objMsg.setOrder(setting.Command.loginfail);
					send(objMsg);		
				}
		}
	}
	/**
	 * 查询好友状态
	 */
	public void checkfriendstatus(Embody objMsg)
	{
		String order=objMsg.getOrder();
		if(order.equals(setting.Command.checkfriendstatus))//读取好友的状态
		{
			User userInfo=new User();
			User user=new User();
			user=(User)objMsg.getObjMessage();
			userInfo=serve.readUserDBbyID(user.getID());
			User userfriendInfo=new User();
			if(userInfo.getFriend().size()>0)
			{
				for(int i=0;i<userInfo.getFriend().size();i++)
				{
					userfriendInfo=(User)userInfo.getFriend().elementAt(0);
					if(serve.isOnline(userfriendInfo))//好友在线 我需把他加如我的好友列表
					{
						objMsg.setSourceID(userInfo.getID());
						objMsg.setDestID(userfriendInfo.getID());//传此好友的ID号给我 以便添加在哪
						objMsg.setObjMessage(userfriendInfo);//传去好友对象
						objMsg.setOrder(setting.Command.friendisonline);//好友在线的信令
						send(objMsg);
					}
					if(!serve.isOnline(userfriendInfo))//不在
					{
						objMsg.setSourceID(userInfo.getID());
						objMsg.setDestID(userfriendInfo.getID());
						objMsg.setObjMessage(userfriendInfo);
						objMsg.setOrder(setting.Command.friendisoffline);//好友不在线的信令
						send(objMsg);
					}
				}
			}			
		}
		if(order.equals(setting.Command.updatemetofriend))
		{
			objMsg.setOrder(setting.Command.updatemetofriendaccept);
			serve.sendpersonal(objMsg.getDestID(), objMsg);//目标ID是好友的
		}

	}
/**
 * 接收用户注册信令
 */
	@SuppressWarnings("unchecked")
	public void registerNewUser(Embody objMsg)
	{
		String order=objMsg.getOrder();
		if(order.equals(setting.Command.register))
		{
			User userInfo=new User();//这是和服务器的首次通信 需实例化userInfo
			//用户的初始状态为1(1为不在线 0为在线)
			userInfo=(User)objMsg.getObjMessage();	//把传来的User对象传给userInfo
			if(!new File(".\\UserDB.db").exists())//若用户数据库文件不存在 即注册的第一个客户
			{
				userInfo.setID(1000);//注册号码的是第一个用户1000			
				serve.addNewUser(userInfo);
				objMsg.setOrder(setting.Command.registersuccess);
				objMsg.setObjMessage(userInfo);
				send(objMsg);

			}else{//若用户数据库文件存在

				serve.readUserDB(); 	//把用户文件中的用户读入arraylist中
				Iterator iter=serve.getArrayList().iterator();
				int size=0;
				while(iter.hasNext())
				{
					@SuppressWarnings("unused")
					User user=(User)iter.next();
					size++;//有多少个用户
				}			
				userInfo.setID(size+1000);
				serve.addNewUser(userInfo);//不用再实例化arraylist
				objMsg.setOrder(setting.Command.registersuccess);
				objMsg.setObjMessage(userInfo);
				send(objMsg);
			}

		}//用户注册
	}
	/**
	 * 接收用户关闭网络连接信令
	 */
	public void closeConn(Embody objMsg)
	{
		String order=objMsg.getOrder();

		if(order.equals("退出"))
		{
			//不再接收来自网络的消息 但还是要要向好友发送的
			User exituser=new User();
			exituser=serve.readUserDBbyID(objMsg.getSourceID());
			exituser.setOffline();
			serve.saveDB(exituser);
			serve.serverUI.getJTextArea().append(Serve.getTime()+" 用户"
          +String.valueOf(exituser.getID())+ "下线"+"\n");
			User userfriendInfo=new User();
			if(exituser.getFriend().size()>0)
			{
				for(int i=0;i<exituser.getFriend().size();i++)
				{
					userfriendInfo=(User)exituser.getFriend().elementAt(i);
					if(serve.isOnline(userfriendInfo))//若用户在线 才发出我离线的通知
					{

⌨️ 快捷键说明

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