📄 controlservice.java
字号:
package group.server;
import java.io.*;
import java.net.*;
import java.util.*;
import group.Customer;
import group.Message;
/**
<code>ControlService</code>此类主要负责处理服务器跟某个客户端连接后的事项
@author wls
*/
public class ControlService extends Thread
{
private static HashMap map = new HashMap();
private static ManageMes manMes = new ManageMes();
private String clientID;
private ObjectOutputStream objOut;
private ObjectInputStream objIn;
private Socket conSocket;
private ServerFrame conFrame;
/**
ControlService类的构造函数,用于初始化一些IO流和起动线程
@param s 连接用的Socket对象
*/
public ControlService(Socket socket, ServerFrame serFrame)
{
conSocket = socket;
conFrame = serFrame;
manMes.setFrame(serFrame);
try
{
objIn = new ObjectInputStream(conSocket.getInputStream());
objOut = new ObjectOutputStream(conSocket.getOutputStream());
}catch(IOException IO_e)
{
conFrame.updateMes("ControlService类中创建输入或者输出流时发生IO错误:\n" +
IO_e.toString());
return;
}
start();
}
/**
结程执行入口,负责与相应的客户端之间的连接
*/
public void run()
{
while(true)
{
try
{
Object obj = objIn.readObject();
System.out.println(obj);
transact(obj);
}catch(IOException IO_e)
{
System.out.println("moveFrend()方法之前");
moveFrend();
conFrame.updateMes("ControlService类的run()方法在读取对象时出现IO错误:\n" +
IO_e.toString());
return;
}
catch(ClassNotFoundException CNF_e)
{
conFrame.updateMes("ControlService类的run()方法在读取对象时出现ClassNotFoundException错误:\n" +
CNF_e.toString());
}
}
}
/**
此方法用来更新服务器和所有客户端的在线好友列表
*/
private void moveFrend()
{
manMes.changeFrend(clientID + "move");
if(map.size() == 0)
{
return;
}
Customer cusObj = new Customer();
setCus(cusObj, clientID, "", manMes.getName(clientID), false, false, true);
map.remove(clientID);
manMes.sendAll(map, cusObj);
}
/*
用于读到和分析对象中信息的方法,并执行相应的动作
@param obj 被分析的对象,有Message和Customer对象两种
*/
private void transact(Object obj) throws IOException
{
boolean bool;
if(obj instanceof Message)
{
Message mesObj = (Message)obj;
String ID = mesObj.getID();
if(!mesObj.isLatent())
{
String tmpMes = manMes.getName(ID) + "[" + ID + "]" + "说: " + mesObj.getMessage();
manMes.changeMes(tmpMes);
mesObj.setMessage(tmpMes);
manMes.sendAll(map, mesObj);
}
else
{
ObjectOutputStream toClient = (ObjectOutputStream)map.get(mesObj.getToFrendID());
mesObj.setMessage(manMes.getName(ID) + "[" + ID + "]" + "对您说: " + mesObj.getMessage());
manMes.sendLatentMes(mesObj, toClient);
}
}
else if(obj instanceof Customer)
{
Customer cusObj = (Customer)obj;
String ID = cusObj.getID();
String passWord = cusObj.getPassWord();
if(cusObj.isLogin())
{
bool = manMes.login(ID, passWord);
if(bool)
{
clientID = ID;
map.put(ID, objOut);
manMes.changeFrend(ID);
setCus(cusObj, clientID, "", manMes.getName(ID), true, false, false);
manMes.sendAll(map, cusObj);
Set set = map.keySet();
Iterator i = set.iterator();
while(i.hasNext())
{
String tmpID = (String)i.next();
Customer tmpCus = new Customer();
if(tmpID.equals(ID))
{
continue;
}
try
{
setCus(tmpCus, tmpID, "", manMes.getName(tmpID), true, false, false);
objOut.writeObject(tmpCus);
}catch(IOException IO_e)
{
}
}
Message mesObj = new Message();
String tmpMes = manMes.getName(ID) +"[" + ID + "]" + "微笑着说:" + "hi !!! 大家好,我来也...";
mesObj.setMessage(tmpMes);
manMes.changeMes(tmpMes);
manMes.sendAll(map, mesObj);
}
else
{
setCus(cusObj, ID, "", "", false, false, false);
try
{
objOut.writeObject(cusObj);
}catch(IOException IO_e2)
{
conFrame.updateMes("登录的成功与否的信息写给客户端时发生IO错误:\n" +
IO_e2.toString());
}
}
}
else if(cusObj.isNewID())
{
ID = manMes.buildID(cusObj.getName(), passWord);
if(ID.equals("faild"))
{
setCus(cusObj, "faild", "", "", false, true, false);
}
else
{
setCus(cusObj, ID, "", "", false, true, false);
}
try
{
objOut.writeObject(cusObj);
}catch(IOException IO_e)
{
conFrame.updateMes("发送注册成功与否的信息给客户端时发生IO错误:\n" +
IO_e.toString());
}
}
}
}
/*
设置Customer对象的状态
*/
private void setCus(Customer cusObj, String id, String passWord, String name,
boolean login, boolean newID, boolean move)
{
cusObj.setID(id);
cusObj.setPassWord(passWord);
cusObj.setName(name);
cusObj.setLogin(login);
cusObj.setNewID(newID);
cusObj.setMove(move);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -