?? jim.java
字號:
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//向服務器端發送刪除好友請求
out.println("DELFRIEND");
out.println(((Friend)myFriends.get(index)).fImNo);
out.println(myImNo);
out.println("END");
//以下在好友列表框中刪除該好友
DefaultListModel mm=(DefaultListModel)jlstFriend.getModel();
mm.removeElementAt(index);
myFriends.removeElementAt(index);
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
}
//查看好友資料菜單選中
void mnItemInfo_mousePressed(MouseEvent e)
{
int index;
index=jlstFriend.getSelectedIndex(); //得到好友序列
if(index!=-1)
{
//生成好友對象
Friend myFriend=(Friend)myFriends.get(index);
ShowFriendInfo showFriendInfoDlg=new ShowFriendInfo(this,myFriend);
showFriendInfoDlg.setLocationRelativeTo(this);
shoeFriendInfoDlg.show();
}
}
//以下為線程的線程體,無限監聽好友發來的消息
public void run()
{
while(true)
{
try
{
byte[] data;
//將接收數據緩沖區數據置空
for(int i=0;i<512;i++)receiveBuf[i]=0;
//接收數據
receiveSocket.receive(receivePacket);
data=receivePacket.getData();
String messageStr=new String(data,0,receivePacket.getLength());
messageStr.trim();
//將接收到數據轉換成消息格式
Message msg=new Message(messageStr);
//以下為在好友列表中查找發來消息的好友是誰,在列表中的位置
int index=-1;
for(int i=0;i<myFriends.size();i++)
{
if(msg.formImNo==((Friend)myFriends.get(i)).fImNo)
{
index=i;
break;
}
}
//若在列表中沒有找到,則是陌生人
if(index==-1) //陌生人
{
//顯示一條消息。告訴用戶有陌生人要與你通訊
if(JOptionPane.showConfirmDialog(this,"有陌生人"+"["+msg.fromImNo+"]"+"要與你聊天。搭理嗎?","提示信息",JOptionPane.YES_NO_OPTION)
==JOptionPane.NO_OPTION)
{
//用戶選擇不理睬
continue;
}
else
{
//選擇理睬,則將陌生人加入好友,在通訊
//先生成好友類對象
AddFriend addFriend=new AddFriend(this,msg.fromImNo);
addFriend.processAddFriend();
index=myFriends.size()-1; //新加好友在列表中的位置
}
}
//如果有好友發來的消息是告訴我他上線了,則將其頭像變彩色
if(msg.commandWord.equals("ONLINE"))
{
if(index!=-1)
{
((Friend)myFriends.get(index)).fRPort=Integer.parseInt(msg.messageString.trim());
DefaultListModel mm=(DefaultListModel)jlstFriend.getModel();
mm.setElementAt(new Object[]{((Friend)myFriends.get(index)).
fNickName,new ImageIcon("face/"+faceOnline[((Friend)myFriends.get(index)).
fFace-1])},index);
((Friend)myFriends.get(index)).fOnline=1;
}
}
//如果有好友發來的消息是告訴我他離線了,則將其頭像變灰色
else if(msg.commandWord.equals("OFFLINE"))
{
if(index!=-1)
{
DefaultListModel mm=(DefaultListModel)jlstFriend.getModel();
mm.setElementAt(new Object[]{((Friend)myFriends.get(index)).
fNickName,new ImageIcon("face/"+faceOffline[((Friend)myFriends.get(index)).
fFace-1])},index);
((Friend)myFriends.get(index)).fOnline=0;
}
}
//如果有好友發來的是普通消息,則將其加到通訊記錄中
else if(msg.commandWord.equals("MESSAGE"))
{
Calendar cal;//創建日歷對象
String msgStr=" ",str;
//通過類的靜態方法得到類的成員,這里得到的時間是當前的時間
cal=Calendar.getInstance();
//下面得到當前時間中的年月日時分秒
str=cal.get(Calendar.YEAR)+"年";
Str+=(cal.get(Calendar.MONTH)+1)+"月";
Str+=cal.get(Calendar.DATE)+"日";
Str+=cal.get(Calendar.HOUR_OF_DAY)+"時";
Str+=cal.get(Calendar.MINUTE)+"分";
Str+= cal.get(Calendar.SECOND)+"秒";
//將消息拼成如下格式;
//第1行:[好友昵稱]XXXX年XX月XX月XX日XX時XX分XX秒說:
//第2行:接收到的具體內容
msgStr+="\n["+((Friend)myFriends.get(index)).fNickName+"]";
msgStr+=str;
msgStr+="說:\n";
msgStr+=msg.messageString;
//將消息加到該好鈾的通訊記錄中
((Friend)myFriends.get(index)).messageLog+=msgStr;
//若與該好友的通訊窗口是打開的,則同時加到通訊記錄文本域控件中
if(((Friend)myFriends.get(index)).isShowDlg)
{
((Friend)myFriends.get(index)).myDialog.jtaMsgLog.append(msgStr);
}
};
}catch(IOException ex){ex.printStackTrace();}
}
}
}
//MessageDialog類
//該類為客戶收發消息的界面類,用于顯示客戶端之間通訊的界面,處理客戶之間收發消息。代碼如下:
class MessageDialog extends JDialog //用戶收發消息類
{
int myImNo; //用戶自己的JIM號
Friend myFriend; //當前好友對象
JPanel jpBottom=new JPanel(); //界面底層面板
JScrollPane jspMsgLog,jspSendMsg; //通訊記錄和發消息的滾動面板
JTextArea jtaMsgLog=new JTextArea(); //通訊記錄文本域
JTextArea jtaSendMsg=new JTextArea(); //發送消息的文本域
JButton jbSend=new JButton(); //"發送"按鈕
public MessageDialog(int myImNo,Friend myFriend)
{
this.myImNo=myImNo;
this.myFriend=myFriend;
this.setTitle("與"+myFriend.fNickName+"的聊天記錄");
jpBottom.setLayout(null);
jpBottom.setBounds(0,0,400,500);
this.getContentPane().setLayout(null);
this.getContentPane().add(jpBottom,null);
jtaMsgLog.setEditable(false);
//將通訊記錄文本域放在通訊記錄滾動面板上
jspMsgLog=new JcrollPane(jtaMsgLog);
//將與當前好友的通訊記錄顯示在通訊記錄文本域上
jtaMsgLog.setText(myFriend.messageLog);
jspMsgLog.setBounds(6,6,380,400);
//將發送消息的文本域放在發送消息的滾動面板上
jspSendMsg=new JScrollPane(jtaSendMsg);
jspSendMsg.setText(6,410,280,45);
jbSend.setText("發送");
jbSend.setBounds(295,415,90,30);
//將通訊記錄和發送消息的滾動面板、發送按鈕加在最底層面板上
jpBottom.add(jspMsgLog,null);
jpBottom.add(jspSendMsg,null);
jpBottom.add(jbSend,null);
jbSend.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jbSend_mouseClicked(e);
}
});
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
this.setSize(400,500);
this.setResizable(false);
}
void jbSend_mouseClickded(MouseEvent e)
{
try
{
Calendar cal;//創建日歷對象
String msgStr=" ",str;
//通過類的靜態方法得到類的成員,這里得到的時間是當前的時間
cal=Calendar.getInstance();
//下面得到當前時間中的年月日時分秒
str=cal.get(Calendar.YEAR)+"年";
Str+=(cal.get(Calendar.MONTH)+1)+"月";
Str+=cal.get(Calendar.DATE)+"日";
Str+=cal.get(Calendar.HOUR_OF_DAY)+"時";
Str+=cal.get(Calendar.MINUTE)+"分";
Str+=cal.get(Calendar.SECOND)+"秒";
//拼接用戶自己說話的內容。兩行:
//第1行:[我]XXXX年XX月XX月XX日XX時XX分XX秒說:
//第2行:具體的內容
msgStr+="\n[我]";
msgStr+=str;
msgStr+="說:\n";
msgStr+=jtaSendMsg.getText().trim();
//將用戶說話的內容加到通訊記錄中,并加在通訊記錄文本域中
myFriend.messageLog+=msgStr;
jtaMsgLog.append(msgStr);
DatagramPacket sendPacket;
DatagramSocket sendSocket;
int sendPort=5000; //用戶的發送端口
//在指定創建用戶的發送數據報的套接字
sendSocket=new DatagramSocket(sendPort);
//生成用戶消息
Message msg=new Message(myImNo,myFriend.fImNo,"MESSAGE",
jtaSendMsg.getText().trim());
//將用戶消息轉換成發送的字節數據
byte[] data;
data=msg.returnMessage().getBytes();
//創建用戶數據報
sendPacket=new DatagramPacket(data,data.length,InetAddress.getByName(myFriend.fIp.trim()),myFriend.fRPort);
//將消息發送出去
sendSocket.send(sendPacket);
sendSocket.close();
//將發送消息文本編輯框內容設置為空
jtaSendMsg.setText(" ");
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING)
{
//將當前好友對象的屬性---通訊窗口是否顯示標志設置為false
myFriend.isShowDlg=false;
}
}
}
//客戶相通訊的消息類
class Message
{
int fromImNo=-1; //發送方JIM號
int toImNo=-1; //接收方JIM號
String commandWord=" "; //命令字
String messageString=" "; //消息內容
//構造方法1:類中的屬性變量由單個變量傳遞值來賦值
public Message(int fromImNo,int toImNo,String commandWord,String messageString)
{
this.fromImNo=fromImNo;
this.toImNo=toImNo;
this.commandWord=commandWord;
this.messageString=messageString;
}
//構造方法2:類中的屬性變量值從一條接收到消息中提取
//接收到的消息格式為:發送方JIM號#接收方JIM號#消息命令字:詳細內容
public Message(String message)
{
int inx;
String tmpStr;
tmpStr=message.trim(); //去掉空格
inx=tmpStr.indexOf("#"); //找第個#號
fromImNo=Integer.parseInt(tmpStr.substring(0,inx)); //第1個#號前為發送方
tmpStr=tmpStr.substring(inx+1);
inx=tmpStr.indexOf("#"); //找第2個#號
toImNo=Integer.parseInt(tmpStr.substring(0,inx)); //第2個#號前為接收方
tmpStr=tmpStr.indexOf(":"); //找":"號
commandWord=tmpStr.substring(0,inx); //":"號前為命令字
messageString=tmpStr.substring(inx+1); //":"號后為信息內容
}
//將類的給定成員變量值構造成一條將要發送的消息
public String returnMessage()
{
return
String.valueOf(fromImNo)+"#"+String.valueOf(toImNo)+"#"+commandWord+
":"+messageString;
}
}
//Friend類
//該類為好友類,用于定義好友的詳細信息。該類代碼如下:
//好友類
class Friend
{
//好友詳細信息
public String fNickName,fIp,fEmail,fHomePage,fPhone,fResume;
public int fImNo,fRPort,fFace,fSex,fAge,fOline;
String messageLog=" "; //與該好友的通訊記錄
boolean isShowDlg=false; //與該好友的通訊窗口是否打開標志
MessageDialog myDialog=null; //與該好友進行收發消息的窗口
//構造方法
public Friend(String fNickName,String fIp,String fEMail,String fHomePage,String fPhone,String fResume,int fImNo,int fRPort,int fFace,int fSex,int fAge,int fOnline)
{
this.fNickName=fNickName;
this.fImNo=fImNo;
this.fIp=fIp;
this.fRPort=fRPort;
this.fEMail=fEMail;
this.fHomePage=fHomePage;
this.fPhone=fPhone;
this.fResume=fResume;
this.fFace=fFace;
this.fSex=fSex;
this.fAge=fAge;
this.fOnline=fOnline;
}
//顯示與該好友的收發訊息窗口
public void showMessageDlg(JimWin jimWin)
{
//將與該好友的通訊窗口是否打開標志設置為true
isShowDlg=true;
//生成通訊窗口
if(this.myDialog==null)
{
MessageDialog myDlg=new MessageDialog(jimWin.myImNo,this);
this.myDialog=myDlg; //該窗口的句柄
myDlg.setLocationRelativeTo(jimWin);
}
this.myDialog.show(); //顯示通訊窗口
}
}
//ShowFriendInfo 類
//用于顯示好友詳細信息的界面類。該類代碼如下:
//顯示好友詳細信息類
class ShowFriendInfo extends JDialog
{
Friend myFriend; //好友對象
JPanel jpBottom=new JPanel();
JTextField jtNickName=new JTextField();
JLabel jlNickName=new JLabel();
JLabel jlImNo=new JLabel();
JTextField jtfImNo=new JTextField();
JComboBox jcbFace=new JComboBox();
JLabel jlSex=new JLabel();
JComboBox jcbSex=new JComboBox();
JLabel jlAge=new JLabel();
JTextField jtfAge=new JTextField();
JLabel jlPhone=new JLabel();
JTextField jtfPhone=new JTextField();
JTextField jtfEMail=new JTextField();
JLabel jlEmail=new JLabel();
JLabel jlHomePage=new JLabel();
JTextField jtfHomePage=new JTextField();
JLabel jlResume=new JLabel();
JTextPane jtpResume=new JTextPane();
JButton jbOK=new JButton();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -