public class ClientSession extends Thread {
FrmServer frm; //GUI窗口类
BufferedReader is = null; //输入流
PrintStream os = null; //输出流
Socket clientSock = null; //客户请求Socket
int curContent = 0;
public ClientSession (FrmServer frm) {
this.frm=frm;
}
public void run () {
parseRequest(); //处理客户请求
}
public void destroy () {
try {
clientSock.close();
is.close();
os.close();
} catch (Exception cs_e) {}
}
//客户请求处理方法,只实现了大厅发言及私下交谈
private void parseRequest () {
String strTalking;
String strUserID;
String strMain = "";
String strPerson = NetUtil.PERSONINFO + "\n";
boolean flagEndProc = false;
while (true) {
try {
while ((strTalking = new String(is.readLine())) != null) {
if(strTalking.equals(NetUtil.CHATSTART)){ //客户会话开始
strUserID = new String(is.readLine());
// 将所有谈话内容发送给刚登录的客户
for (int i = 0; i < frm.dataProcessor.vecMainTalk.size(); i++) {
strMain += (String)frm.dataProcessor.vecMainTalk.get(i);
strMain += "\n";
}
curContent = frm.dataProcessor.vecMainTalk.size();
os.println(strMain);
os.flush();
for (int j = 0; j < frm.dataProcessor.vecP2PInfo.size(); j++) {
strPerson += (String)frm.dataProcessor.vecP2PInfo.get(j);
strPerson += "\n";
}
os.println(strPerson);
os.flush(); //将所有在线用户名单发给新加入的客户
os.println(NetUtil.DIVIDEDLINE);
os.flush();
while (true) {
this.sleep(1000);
String strContent = "";
//如果有人发言,则把发言发给在线客户
if (frm.dataProcessor.vecMainTalk.size() > curContent) {
for (int ci = curContent; ci <frm.dataProcessor.vecMainTalk.size(); ci++) {
strContent +=(String)frm.dataProcessor.vecMainTalk.get(ci);
strContent += "\n";
}
curContent = frm.dataProcessor.vecMainTalk.size();
os.println(strContent);
os.flush();
}
//如果有人私下交谈,则把交谈的内容发给交谈的另一方
if (strUserID != null) {
int nvi = 0;
for (nvi = 0; nvi <
frm.dataProcessor.vecSelfInfo.size()&& !((String)((Vector)frm.dataProcessor.vecSelfInfo.get
(nvi)).get(0)).equals(strUserID); nvi++);
if (nvi < frm.dataProcessor.vecSelfInfo.size()) {
Vector vecTalk =(Vector)frm.dataProcessor.vecSelfInfo.get(nvi);
if ((String)vecTalk.get(1)).equals(NetUtil.CALLED)){
String strCallRes = NetUtil.ISCALLED+ "\n";
String strCallTemp = (String)vecTalk.get(2);
strCallRes += strCallTemp;
os.println(strCallRes);
os.flush();
}
else if(((String)vecTalk.get(1)).equals(NetUtil.CALLING)){
if(((String)vecTalk.get(3)).equals(NetUtil.RESPONSING)){ //一客户呼叫另一客户并有了回应
String strResponsing =NetUtil.RESPONSE + "\n";
String strResponsingT =(String)vecTalk.get(2);
strResponsing += strResponsingT;
os.println(strResponsing);
os.flush();
//设置客户“正在私下交谈”状态
vecTalk.setElementAt(NetUtil.CHATTING, 1);
String strOther = (String)vecTalk.get(2);
int setvi = 0;
for (setvi = 0; setvi <frm.dataProcessor.vecSelfInfo.size()
&& !((String)((Vector)frm.dataProcessor.vecSelfInfo.get(setvi)).get(0)).equals(strOther); setvi++);
Vector vecOther = (Vector)frm.dataProcessor.vecSelfInfo.get(setvi);
vecOther.setElementAt(NetUtil.CHATTING,1);
}}
else if (((String)vecTalk.get(1)).equals(NetUtil.CHATTING)) {
String strCurContent = (String)vecTalk.get(4);
if (!strCurContent.equals(NetUtil.NONCONTENT)) {
String strToWho = vecTalk.get(2)+ "\n";
String strPerRes = NetUtil.PERSONALRECEIVE+ "\n";
strPerRes += strToWho;
strPerRes += strCurContent;
os.println(strPerRes);
os.flush();
vecTalk.setElementAt(NetUtil.NONCONTENT,4);
}}}}}}
// 处理客户发来与另一客户私下交谈的请求
else if (strTalking.equals(NetUtil.PERSONALTALK)) {
strTalking = new String(is.readLine());
int vi = 0;
for (vi = 0; vi < frm.dataProcessor.vecSelfInfo.size()
&& !((String)((Vector)frm.dataProcessor.vecSelfInfo.get(vi)).get(0)).equals(strTalking); vi++);
if (vi == frm.dataProcessor.vecSelfInfo.size()) {
os.println(NetUtil.NOTEXIST);
os.flush();
}
else {
Vector vec = (Vector)frm.dataProcessor.vecSelfInfo.get(vi);
String strCall = new String(is.readLine());
vec.setElementAt(NetUtil.CALLED, 1);
vec.setElementAt(strCall, 2);
int vi_c = 0;
for (vi_c = 0; vi_c < frm.dataProcessor.vecSelfInfo.size()
&& !((String)((Vector)frm.dataProcessor.vecSelfInfo.get(vi_c)).get(0)).equals(strCall); vi_c++);
if (vi_c == frm.dataProcessor.vecSelfInfo.size()) {
os.println(NetUtil.NOTEXIST);
os.flush();
}
Vector vec_c = (Vector)frm.dataProcessor.vecSelfInfo.get(vi_c);
vec_c.setElementAt(NetUtil.CALLING, 1);
vec_c.setElementAt(strTalking, 2);
os.println(NetUtil.RESPONSE);
os.flush();
}
flagEndProc = true;
}
// 存储新客户的信息
else if (strTalking.equals(NetUtil.PERSONNAME)) {
String strName = "";
frm.isStart = true;
strName = new String(is.readLine());
if (strName != "\n") {
frm.dataProcessor.vecP2PInfo.addElement(strName);
Vector vec = new Vector();
vec.addElement(strName);
vec.addElement(NetUtil.IDLE);
vec.addElement(NetUtil.NONE);
vec.addElement(NetUtil.NORESPONSE);
vec.addElement(NetUtil.NONCONTENT);
frm.dataProcessor.vecSelfInfo.addElement(vec);
}
flagEndProc = true;
}
//私下交谈时,处理被叫方发送的应答请求
else if (strTalking.equals(NetUtil.SETRESPONSE)) {
String strResName = new String(is.readLine());
int res = 0;
for (res = 0; res < frm.dataProcessor.vecSelfInfo.size()
&&!((String)((Vector)frm.dataProcessor.vecSelfInfo.get(res)).get(0)).equals(strResName); res++);
Vector vecRes = (Vector)frm.dataProcessor.vecSelfInfo.get(res);
vecRes.setElementAt(NetUtil.RESPONSING, 3);
}
//私下交谈时,处理主叫方发送的“开始交谈“请求
else if (strTalking.equals(NetUtil.PERSONALTALKSTART)) {
String strPerCallName = new String(is.readLine());
String strPerTalkContent = new String(is.readLine());
int pres = 0;
for (pres = 0; pres < frm.dataProcessor.vecSelfInfo.size()
&&!((String)((Vector)frm.dataProcessor.vecSelfInfo.get(pres)).get(0)).equals(strPerCallName);
pres++);
Vector vecPer = (Vector)frm.dataProcessor.vecSelfInfo.get(pres);
vecPer.setElementAt(strPerTalkContent, 4);
}
else {
if (!strTalking.equals("\n") && !strTalking.equals("")) {
frm.dataProcessor.vecMainTalk.addElement(strTalking);
strTalking += "\n";
}
flagEndProc = true;
}}
} catch (Exception io_e) {
frm.statusBar.setText(io_e.getMessage());
}
if (flagEndProc)
break;
}}} |