?? client.java
字號(hào):
import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.Hashtable;
import javax.swing.Timer;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class Client implements Runnable{
private LoginDiag loginframe;
private UserInfo myself;
private Socket CSocket;
//流
private ObjectOutputStream StreamOut;
private ObjectInputStream StreamIn;
private Vector OnlineUsers;
private Vector OfflineUsers;
private Vector PubMsglist;
private Vector Msglist;
private ClientFrame clientframe;
//線程體
private boolean shutdown=false;
public Client(){
OnlineUsers=new Vector();
OfflineUsers=new Vector();
PubMsglist=new Vector();
Msglist=new Vector();
clientframe=new ClientFrame(this);
loginframe=new LoginDiag(this);
loginframe.setVisible(true);
}//public Client()
public User getmyself(){
return myself.getUser();
}
public void connect(String IP,int port)throws Exception{
System.out.println("in connect() 服務(wù)器IP+Port="+IP+":"+port);
try{
System.out.println("準(zhǔn)備連接服務(wù)器");
CSocket=new Socket(IP,port);
System.out.println("服務(wù)器連接成功");
StreamOut=new ObjectOutputStream(CSocket.getOutputStream());
StreamIn=new ObjectInputStream(CSocket.getInputStream());
System.out.println("流創(chuàng)建成功");
}catch(Exception e){
throw e;
}
}//public void connect(String IP,int port)throws UnknownHostException,IOException
public int getClientPort(){//在connect()方法之前調(diào)用會(huì)出錯(cuò)
return CSocket.getLocalPort();
}
public String getIPAddr(){//在connect()方法之前調(diào)用會(huì)出錯(cuò)
return CSocket.getLocalAddress().getHostAddress();
}
public boolean login(UserInfo myself,boolean Register){
System.out.println("in login()");
System.out.println("UserInfo myself="+myself);
System.out.println("boolean Register="+Register);
this.myself=myself;
char Cetified;
try{
if(Register){
StreamOut.writeChar('R');
}else{
StreamOut.writeChar('L');
}
StreamOut.writeObject(myself);
StreamOut.flush();
System.out.println("連接服務(wù)器的用戶信息:");
myself.display();
System.out.println("等待服務(wù)器反饋信息:(Y/N)");
Cetified=StreamIn.readChar();
System.out.println("服務(wù)器的返回信息:");
if(Cetified=='Y'){
System.out.println("收到Y(jié)準(zhǔn)備進(jìn)入初始化Init()");
Init();
new Thread(this).start();
clientframe.setVisible(true);
return true;
}
else{return false;}
}catch(Exception e){
return false;
}
}//public boolean login(UserInfo myself,boolean Register)
public void Init()throws Exception{
System.out.println("in Init()");
PublicMessage tempPubMsg;
Message tempmsg;
UserInfo tempUser;
char tempConChar;
boolean over=false;
try{
System.out.println("準(zhǔn)備進(jìn)入while(!over)");
while(!over){
//System.out.println("in while(!over)");
tempConChar=StreamIn.readChar();
switch(tempConChar){
case 'C':{//公告
//System.out.println("in case 'C' 接收公告");
tempPubMsg=(PublicMessage)StreamIn.readObject();
//System.out.print("接收的公告==null? ");
//System.out.println(tempPubMsg==null);
//tempPubMsg.display();
PubMsglist.add(tempPubMsg);
//System.out.println("正確一個(gè)接收公告");
break;
}//case 'C':
case 'M':{//留言
//System.out.println("in case 'M' 接收留言");
tempmsg=(Message)StreamIn.readObject();
Msglist.add(tempmsg);
break;
}//case 'M':
case 'F':{//其他用戶
//System.out.println("in case 'F' 接收用戶");
tempUser=(UserInfo)StreamIn.readObject();
//System.out.print("接收的用戶==null?");
//System.out.println(tempUser==null);
if(tempUser.getRegName().equals(this.myself.getRegName())){
this.myself=tempUser;
}else{
if(tempUser.getOnlineState()){
OnlineUsers.add(tempUser.getUser());
}else{
OfflineUsers.add(tempUser.getUser());
}//offline
}//if(!tempUser.getRegName().equals(this.myself.getRegName()))
break;
}//case 'F':
case 'E':{//初始化信息接收完畢
over=true;
System.out.println("接收到初始化結(jié)束標(biāo)志'E'");
break;
}//case 'E'
}//switch(tempConChar)
}//while(!over)
//System.out.println("初始化clientframe前:");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());
//System.out.println("PubMsglist.size()="+PubMsglist.size());
//System.out.println("Msglist.size()="+Msglist.size());
System.out.println("開始初始化clientframe");
clientframe.Init(OnlineUsers,OfflineUsers,PubMsglist,Msglist);
}catch(Exception e){
System.out.println(e);
throw e;
}//catch(Exception e)
}//public void Init()throws Exception
public void send(Message msg,boolean RealTime){
System.out.println("in Client send(Message msg,boolean RealTime)");
try{
//StreamOut.flush();
if(RealTime){
StreamOut.writeChar('F');
}else{
StreamOut.writeChar('M');
}
//StreamOut.flush();
msg.setFromName(myself.getRegName());
StreamOut.writeObject(msg);
StreamOut.flush();
System.out.println("即時(shí)信息已經(jīng)正確傳送");
}catch(Exception e){
System.out.println("IO Error in Client send()");
//有IO錯(cuò)誤忽略
//StreamOut.close();
//StreamIn.close();
//CSocket.close();
System.out.println("IO Error In Client's send()");
JOptionPane.showMessageDialog(clientframe,
"Server connected error,will exit!",
"Error",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}//catch(Exception e)
}//public void send(Message msg,boolean Conbool)
public void send(User myNewInfo){
System.out.println("in Client send(User myNewInfo)");
try{
//StreamOut.flush();
System.out.println("in Client send(User myNewInfo),發(fā)送數(shù)據(jù):");
System.out.println("in InputThread 用戶名:"+myNewInfo.getUserName());
System.out.println("in InputThread 職位:"+myNewInfo.getJob());
System.out.println("in InputThread 密碼:"+myNewInfo.getPassword());
System.out.println("in InputThread 郵箱:"+myNewInfo.getEMail());
System.out.println("in InputThread 電話:"+myNewInfo.getTel());
StreamOut.writeChar('N');
StreamOut.writeObject(myNewInfo);
StreamOut.flush();
System.out.println("個(gè)人最新信息已經(jīng)正確傳送");
}catch(Exception e){
System.out.println("IO Error in Client send()");
//有IO錯(cuò)誤忽略
//StreamOut.close();
//StreamIn.close();
//CSocket.close();
System.out.println("IO Error In Client's send()");
JOptionPane.showMessageDialog(clientframe,
"Server connected error,will exit!",
"Error",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}//catch(Exception e)
}//public void send(User myNewInfo)
public void logoff(){
try{
StreamOut.writeChar('D');
StreamOut.flush();
//2秒鐘后自動(dòng)退出
System.out.println("2秒鐘后自動(dòng)關(guān)閉");
Timer ClientExit =new Timer(2000,new ActionListener(){
public void actionPerformed(ActionEvent evt){
System.out.println("in logoff() 準(zhǔn)備結(jié)束程序");
System.exit(0);
}
});
ClientExit.start();
}catch(Exception e){
//有IO錯(cuò)誤則退出 //關(guān)閉流
System.out.println("IO Error In Client's logoff() 準(zhǔn)備結(jié)束程序");
JOptionPane.showMessageDialog(clientframe,
"Server connected error!",
"Error",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}//catch(Exception e)
}//public void logoff()
public boolean isOnline(String RegName){
//由ClientFrame同名方法調(diào)用
User tempUser;
int OnUserslen,OffUserslen;
int i;
OnUserslen=OnlineUsers.size();
OffUserslen=OfflineUsers.size();
if(OnUserslen<OffUserslen){
for(i=0;i<OnUserslen;i++){
tempUser=(User)OnlineUsers.get(i);
if(tempUser.getRegName().equals(RegName)) break;
}
if(i==OnUserslen) return false;
else return true;
}else{
for(i=0;i<OffUserslen;i++){
tempUser=(User)OfflineUsers.get(i);
if(tempUser.getRegName().equals(RegName)) break;
}
if(i==OffUserslen) return true;
else return false;
}
}//public boolean isOnline(String RegName)
public User indexToUser(boolean OnlineUserlist,int index){
//由ClientFrame雙擊事件調(diào)用
//要求Jlist中條目與OnlineUsers和OfflineUsers中條目保持一致(下標(biāo)嚴(yán)格對應(yīng))
//這樣就能保證返回值不會(huì)為null
User tempUser;
if(OnlineUserlist){
tempUser=(User)OnlineUsers.get(index);
return tempUser;
}else{
tempUser=(User)OfflineUsers.get(index);
return tempUser;
}
}//public String indexToUser(boolean OnlineUserlist,int index)
public int RegNameToindex(String RegName,boolean OnlineUserlist){
//有ClientFrame中RealTimeMsgReceiver(Message msg)調(diào)用
User tempUser;
int len;
int i;
if(OnlineUserlist){
len=OnlineUsers.size();
for(i=0;i<len;i++){
tempUser=(User)OnlineUsers.get(i);
if(tempUser.getRegName().equals(RegName)) break;
}
}else{
len=OfflineUsers.size();
for(i=0;i<len;i++){
tempUser=(User)OfflineUsers.get(i);
if(tempUser.getRegName().equals(RegName)) break;
}
}
if(i==len) return -1;
else return i;
}//public int RegNameToindex(String RegName,boolean OnlineUserlist)
public User RegNameToUser(String RegName){
//由ClientFrame的RealTimeMsgReceiver(Message msg)方法調(diào)用
User tempuser=null;
for(int i=0,len=OnlineUsers.size();i<len;i++){
tempuser=(User)OnlineUsers.get(i);
if(tempuser.getRegName().equals(RegName))
break;
}
for(int i=0,len=OfflineUsers.size();i<len;i++){
tempuser=(User)OfflineUsers.get(i);
if(tempuser.getRegName().equals(RegName))
break;
}
return tempuser;
}//public User RegNameToUser(String RegName)
public void run(){
PublicMessage tempPubMsg;
Message tempmsg;
User tempUser;
char tempConchar;
try{
while(!shutdown){
System.out.println("in Client run() while(!shutdown) 準(zhǔn)備接收服務(wù)器的控制字符");
tempConchar=StreamIn.readChar();
switch(tempConchar){
case 'U':{
/*************************以下測試************************************/
//System.out.println("in Client run() case'U'");//\n兩個(gè)Vector中條目修改之前");
///System.out.println("OnlineUsers中內(nèi)容:");
//User testUser;
//for(int i=0,len=OnlineUsers.size();i<len;i++){
// testUser=(User)OnlineUsers.get(i);
// testUser.display();
// System.out.println();
//}
//System.out.println("OfflineUsers中內(nèi)容:");
//for(int i=0,len=OfflineUsers.size();i<len;i++){
// testUser=(User)OfflineUsers.get(i);
/// testUser.display();
// System.out.println();
//}
/*************************以上測試************************************/
tempUser=(User)StreamIn.readObject();
if(tempUser.getRegName().equals(this.myself.getRegName())) break;
//檢查有沒有重名(RegName相同)
//防止兩用戶上線時(shí)間很接近后上者在線用戶列表中就會(huì)出現(xiàn)兩個(gè)先上者
int i,len=OnlineUsers.size();
for(i=0;i<len;i++){
if(((User)OnlineUsers.get(i)).getRegName().equals(tempUser.getRegName())) break;
}
if(i==len) OnlineUsers.add(tempUser);//沒有,添加
//如果是OfflineUsers中的用戶上線則OfflineUsers中相應(yīng)條目刪除
for(i=0,len=OfflineUsers.size();i<len;i++){
if(((User)OfflineUsers.get(i)).getRegName().equals(tempUser.getRegName())){
OfflineUsers.removeElementAt(i);
//System.out.println("成功刪除不在線列表中的用戶");
//testUser.display();
break;
}//if()
}//for
//System.out.println("用戶上線后刷新ClientFrame之前");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());
clientframe.UpdateUserlist(OnlineUsers,OfflineUsers);
break;
}//case 'U':
case 'D':{
tempUser=(User)StreamIn.readObject();
OfflineUsers.add(tempUser);
//如果是OnlineUsers中的用戶下線則OnlineUsers中相應(yīng)條目刪除
for(int i=0,len=OnlineUsers.size();i<len;i++){
if(((User)OnlineUsers.get(i)).getRegName().equals(tempUser.getRegName())){
OnlineUsers.removeElementAt(i);
break;
}//if()
}//for
//System.out.println("用戶下線后刷新ClientFrame之前");
//System.out.println("OnlineUsers.size()="+OnlineUsers.size());
//System.out.println("OfflineUsers.size()="+OfflineUsers.size());
clientframe.UpdateUserlist(OnlineUsers,OfflineUsers);
break;
}//case 'D':
case 'F':{
System.out.println("準(zhǔn)備接收即時(shí)信息");
tempmsg=(Message)StreamIn.readObject();
System.out.println("成功接收即時(shí)信息,準(zhǔn)備交付clientframe");
clientframe.RealTimeMsgReceiver(tempmsg);
break;
}//case 'F':
case 'C':{
tempPubMsg=(PublicMessage)StreamIn.readObject();
PubMsglist.add(tempPubMsg);
clientframe.PubMsgReceiver(tempPubMsg);
break;
}//case 'C':
case 'G':{
shutdown=true;
//關(guān)閉流可以沒有
System.out.println("in Client run() while case 'G'準(zhǔn)備結(jié)束程序");
System.exit(0);
break;
}//case 'G':
}//switch(tempConchar)
}//while(!shutdown)
}catch(Exception e){
System.out.println("IO Error In Client's run()");
JOptionPane.showMessageDialog(clientframe,
"Server connected error,will exit!",
"Error",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}//catch(Exception e)
}//public void run()
public static void main(String args[]){
new Client();
}//main()
}//class ServerFrame
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -