?? serverthread.java
字號(hào):
import java.io.*;
import java.net.*;
import java.util.LinkedList;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class ServerThread{
private Server server;
private SwitchThread switchthread;
private UserInfo yourself;
private Socket Csocket;
//流
private ObjectOutputStream StreamOut;
private ObjectInputStream StreamIn;
private boolean invoked=false;
private boolean shutdown=false;
private LinkedList ONingQueue;
private LinkedList OFFingQueue;
private LinkedList RealTimeMsgQueue;
private LinkedList NewPubMsgQueue;
private Timer OutPutTimer;//在OutputThread中創(chuàng)建
public ServerThread(){}
public ServerThread(Server server,
SwitchThread switchthread,
UserInfo yourself,
Socket Csocket,
ObjectOutputStream StreamOut,
ObjectInputStream StreamIn){
this.server=server;
this.switchthread=switchthread;
this.yourself=yourself;
this.Csocket=Csocket;
this.StreamOut=StreamOut;
this.StreamIn=StreamIn;
ONingQueue=new LinkedList();
OFFingQueue=new LinkedList();
RealTimeMsgQueue=new LinkedList();
NewPubMsgQueue=new LinkedList();
new Thread(new InputThread()).start();
new Thread(new OutputThread()).start();
}//public ServerThread()
public void IOF(Timer timer){
System.out.println("In IOF()");
if(invoked) return;
invoked=true;
timer.stop();
server.OffUserReceiver(yourself.getUser());
terminate();
//server.OffUserReceiver(yourself)后terminate()
//確保先將CSthread中條目移除后再關(guān)閉OutputThread退出
}//public void IOF(Timer timer)
public void terminate(){
System.out.println("In terminate()");
shutdown=true;
System.out.print("In terminate() shutdown=");
System.out.println(shutdown);
}//public void terminate()
/********************下面四個(gè)方法由SwitchThread調(diào)用*****************************/
public void OnUserReceiver(User Onuser){
synchronized(ONingQueue){ONingQueue.add(Onuser);}
}//public void OnUserReceiver(User Onuser)
public void OffUserReceiver(User Offuser){
synchronized(OFFingQueue){OFFingQueue.add(Offuser);}
}//public void OffUserReceiver(User Offuser)
public void RealTimeMsgReceiver(Message msg){
System.out.println("in ServerThread RealTimeMsgReceiver\n即時(shí)信息正在交付對(duì)應(yīng)ServerThread");
synchronized(RealTimeMsgQueue){RealTimeMsgQueue.add(msg);}
System.out.println("in ServerThread RealTimeMsgReceiver\n即時(shí)信息已經(jīng)成功添加到\nServerThread RealTimeMsgQueue");
}//public void RealTimeMsgReceiver(Message)
public void PubMsgReceiver(PublicMessage pubmsg){
synchronized(NewPubMsgQueue){NewPubMsgQueue.add(pubmsg);}
}//public void PubMsgReceiver(PublicMessage pubmsg)
/********************上面四個(gè)方法由SwitchThread調(diào)用*****************************/
public static void main(String args[]){
new ServerThread();
}//main()
class InputThread implements Runnable{
Message tempmsg;
User tempUser;
char tempConChar;
public void run(){
System.out.println("in InputThread");
try{
while(!shutdown){
tempConChar=StreamIn.readChar();
switch(tempConChar){
case 'F':{//即時(shí)信息
System.out.println("In InputThread case'F'--收到即時(shí)信息");
tempmsg=(Message)StreamIn.readObject();
System.out.println("即時(shí)信息成功讀取,并準(zhǔn)備交給switchthread.RealTimeMsgReceiver()");
switchthread.RealTimeMsgReceiver(tempmsg);
break;
}//case 'F':
case 'M':{//留言
tempmsg=(Message)StreamIn.readObject();
server.MsgReceiver(tempmsg);
break;
}//case 'M':
case 'N':{//用戶修改信息
tempUser=(User)StreamIn.readObject();
/******************************以下測(cè)試*************************************************************************/
System.out.println("in InputThread,收到修改后的用戶信息 tempUser:");
System.out.println("in InputThread 用戶名:"+tempUser.getUserName());
System.out.println("in InputThread 職位:"+tempUser.getJob());
System.out.println("in InputThread 密碼:"+tempUser.getPassword());
System.out.println("in InputThread 郵箱:"+tempUser.getEMail());
System.out.println("in InputThread 電話:"+tempUser.getTel());
/******************************以上測(cè)試*************************************************************************/
server.UserInfoModifyReceiver(tempUser);
break;
}//case 'N':
case 'D':{//當(dāng)前用戶下線
IOF(OutPutTimer);
break;
}//case 'D':
}//switch(tempConChar)
}//while(!shutdown)
}catch(Exception e){
System.out.println("in InputThread run()異常");
System.out.println(e);
System.out.println(((OptionalDataException)e).eof);
System.out.println(((OptionalDataException)e).length);
System.out.println("準(zhǔn)備調(diào)用IOF(Timer)");
IOF(OutPutTimer);
}//catch(Exception e)
}//public void run()
}//class InputThread implements Runnable
class OutputThread implements Runnable{
//User tempUser;
//Message tempmsg;
//PublicMessage tempPubMsg;
public void run(){
System.out.println("in OutputThread");
OutPutTimer=new Timer(2000,new ActionListener(){
User tempUser;
Message tempmsg;
PublicMessage tempPubMsg;
public void actionPerformed(ActionEvent evt){
//System.out.println("in OutputThread OutPutTimer");
try{
if(shutdown){
System.out.println("in OutputThread 準(zhǔn)備發(fā)送結(jié)束控制字符'G'");
StreamOut.writeChar('G');
StreamOut.flush();
return;
}
synchronized(ONingQueue){
for(;ONingQueue.size()>0;){
tempUser=(User)ONingQueue.poll();
StreamOut.writeChar('U');
StreamOut.writeObject(tempUser);
StreamOut.flush();
}
}//synchronized(ONingQueue)
synchronized(OFFingQueue){
for(;OFFingQueue.size()>0;){
tempUser=(User)OFFingQueue.poll();
StreamOut.writeChar('D');
StreamOut.writeObject(tempUser);
StreamOut.flush();
}
}//synchronized(OFFingQueue)
synchronized(RealTimeMsgQueue){
for(;RealTimeMsgQueue.size()>0;){
System.out.println("in OutPutTimer正準(zhǔn)備向客戶端發(fā)送一個(gè)即時(shí)信息");
tempmsg=(Message)RealTimeMsgQueue.poll();
StreamOut.writeChar('F');
StreamOut.writeObject(tempmsg);
StreamOut.flush();
System.out.println("in OutPutTimer已經(jīng)成功向客戶端發(fā)送了一個(gè)即時(shí)信息");
}
}//synchronized(RealTimeMsgQueue)
synchronized(NewPubMsgQueue){
for(;NewPubMsgQueue.size()>0;){
tempPubMsg=(PublicMessage)NewPubMsgQueue.poll();
StreamOut.writeChar('C');
StreamOut.writeObject(tempPubMsg);
StreamOut.flush();
}
}//synchronized(NewPubMsgQueue)
}catch(Exception e){
System.out.println("in OutPutTimer異常");
System.out.println(e);
System.out.println("準(zhǔn)備調(diào)用IOF(Timer)");
IOF(OutPutTimer);
}//catch(Exception e)
}//public void actionPerformed(ActionEvent evt)
});
OutPutTimer.start();
//try{
// while(!shutdown){
// }//while(!shutdown)
//}catch(Exception e){
// IOF(OutPutTimer);
// }//catch(Exception e)
}//public void run()
}//class OutputThread implements Runnable
}//class ServerThread
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -