?? jim.java.bak
字號:
this.setResizable(false);
this.setSize(new Dimension(200,400));
this.setTitle("JIM");
contentPane=(JPanel)this.getContentPane();
contentPane.setLayout(null);
//通過MVS方式定制好友列表
ListModel model=new NameAndPicListModel(myFriends,faceOnline);
ListCellRenderer renderer=new NameAndPicListCellRenderer();
jlstFriend=new JList(model);
jlstFriend.setBackground(new Color(255,255,210);
jlstFriend.setAlignmentX((float)1.0);
jlstFriend.setAlignmentY((float)1.0);
jlstFriend.setCellRenderer(renderer);
jlstFriend.setVisibleRowCount(7);
jlstFriend.addMouseClicked(MouseEvent e){
jlstFriend_mouseClicked(e);
}
});
mnItemMsg.setText("收發(fā)訊息");
mnItemMsg.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e){
mnItemMsg_mousePressed(e);
}
});
mnItemInfo.setText("查看資料");
mnItemInfo.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e){
mnItemInfo_mousePressed(e);
}
});
mnItemAddFriend.setText("增加好友");
mnItemAddFriend.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e){
mnItemAddFriend_mousePressed(e);
}
});
mnItemDelFriend.setText("刪除好友");
mnItemDelFriend.addMouseListener(new java.awt.event.MouseAdapter(){
public void mousePressed(MouseEvent e){
mnItemDelFriend_mousePressed(e);
}
});
jspList=new JScrollPane(jlstFriend);
jspList.setBounds(10,10,175,350);
contentPane.add(jspList);
jPopupMenu1.add(mnItemMsg);
jPopupMenu1.add(mnItemInfo);
jPopupMenu1.add(mnItemAddFriend);
jPopupMenu1.add(mnItemDelFriend);
}
//以下該方法為連接服務器端,并進行接收消息的UDP端口號登記和查詢好友信息等
piblic void ConnectServer(int myImNo)
{
Socket socket;
BufferedReader in;
PrintWriter out;
try
{
socket=new Socket(InetAddress.getByName(serverName),serverPort);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//向服務器端發(fā)送登記接收信息的UDP端口號請求
out.println("CLIENTPORT");
out.println(String.valueOf(CreateUDP()));
out.println(String.valueOf(myImNo));
out.println("FRIEND");
out.println("myImNo");
String fNickName, fImNo, fFace,fSex,fAge,fIp,fRPort,fOnline,fEMail,fHomePage,fPhone,fResume;
do
{
//循環(huán)讀取服務器端返回的好友信息,直到服務器端發(fā)送OVER
fNickName=in.readLine();
if(fNickName.equals("OVER")) break;
fImNo=in.readLine();
fFace=in.readLine();
fSex=in.readLine();
fAge=in.readLine();
fIp=in.readLine();
fRPort=in.readLine();
fOnline=in.readLine();
fEMail=in.readLine();
fHomePage=in.readLine();
fPhone=in.readLine();
fResume=in.readLine();
//將好友信息生成好友對象,并加入到好友列表中
myFriends.add(new Friend(fNickName, fIp, fEMail,fHomePage,fPhone,fResume,Integer.parseInt(fImNo),
Integer.parseInt(fRPort),Integer.parseInt(fFace),Integer.parseInt(fSex),Integer.parseInt(fAge),
Integer.parseInt(fOnline)));
}while(!fNickName.equals("OVER"));
//向服務器發(fā)送查詢哪些人加我為好友的請求
out.println("GETWHOADDME");
out.println(myImNo);
DatagramPacket sendPacket;
DatagramPacket sendSocket;
int sendPort=5000;
do
{
//讀取服務器端返回的好友IP地址、UDP端口和好友JIM號
fIp=in.readLine();
if(fIp.equals("OVER")) break;
fRPort=in.readLine();
fImNo=in.readLine();
//通過UDP方式向好友發(fā)送我在線消息
sendSocket=new DatagramSocket(sendPort);
Message msg=new Message(myImNo,Integer.parseInt(fImNo),"ONLINE",String.valueOf(udpPORT));
byte[] data;
data=msg.returnMessage().getBytes();
sendPacket=new DatagramPacket(data,data.length,InetAddress.getByName(fIP),Integer.parseInt(fRPort));
sendSocket.send(sendPacket);
sengSocket.close();
}while(!fIp.equals("OVER"));
//向服務器端發(fā)送終止通訊的請求
out.println("END");
socket.close();
}
catch(IOException e1)
{
System.out.println("FALSE");
}
//以下在列表中顯示好友
DefaultListModel mn=(DefaultListModel)jlstFriend.getModel();
int faceId;
for(int i=0;i<myFriends.size();i++) //對所有好友做
{
faceId=((Friend)myFriends.get(i)).fFace; //獲取好友頭像號
if(((Friend)myFriends.get(i)).fOnline==1)
{
//若好友在線,則在列表中顯示在線的頭像
mm.addElement(new Object[]{((Friend)myFriends.get(i)).fNickName,new ImageIcon ("face/"+faceOnline[faceId-1])});
}
else
{
//若好友離線,則在列表中顯示離線的頭像
mm.addElement(new Object[]{((Friend)myFriends.get(i)).fNickName,new ImageIcon ("face/"+faceOffline[faceId-1])});
}
}
//若有好友存在則列表框的當前選擇為第1個好友
if(myFriends.size()>0)jlstFriend.setSelectedIndex(0);
}
//下面的方法用于創(chuàng)建用戶接收信息的UDP數(shù)據(jù)報Socket和Packet
public int CreateUDP()
{
boolean flag=false;
int i=0;
do
{
try
{
udpPORT+=i++;
receiveSocket=new DatagramSocket(udpPORT);
receivePacket=new DatagramSocket(receiveBuf,receiveBuf.length);
flag=true; //創(chuàng)建成功
}
catch(SocketException se)
{
//若有異常說明該端口已經(jīng)使用,于是循環(huán)端口號加1再試
//主要是在同一臺計算機上打開多個JIM軟件時有用
}
}while(!flag);
return udpPORT; //返回UDP端口號
}
//關閉程序
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
Socket socket;
BufferedReader in;
PrintWriter out;
if(e.getID()==WindowEvent.WINDOW_CLOSING)
{
try
{ socket=new Socket(InetAddress.getByName(serverName),serverPort);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//向服務器發(fā)送查詢誰加我為好友的請求
out.println("GETWHOADDME");
out.println(myImNo);
DatagramPacket sendPacket;
DatagramSocket sendsocket;
int sendPort=5000;
String fIp,fRPort,fImNo;
do
{
//獲得好友的信息,直到服務器發(fā)送OVER消息
fIp=in.readLine();
if(fIp.equals("OVER")) break;
fRPort=in.readLine();
fImNo=in.readLine();
sendSocket=new DatagramSocket(sendPort);
//構(gòu)造消息并通過UDP方式發(fā)出,該消息告訴好友我離線
Message msg=new Message(myImNo,Integer.parseInt(fImNo),"OFFLINE"," ");
byte[] data;
data=msg.returnMessage().getBytes();
sendPacket=new
DatagramPacket(data,data.length,InetAddress.getByName(fIp),Integer.parseInt(fRPort));
sendSocket.send(sendPacket);
sengSocket.close();
}while(!fIp.equals("OVER"));
//告訴服務器我下線了
out.println("LOGOUT");
out.println(myImNo);
//告訴服務器終止通訊
out.println("END");
socket.close();
}
catch(Exception e2)
{
e2.printStackTrace();
}
System.exit(0);
}
}
//好友列表框發(fā)生mouseClicked事件
void jlstFriend_mouseClicked(MouseEvent e)
{
if(e.isMetaDown()) //判斷是否是鼠標左鍵
{
//顯示快揭菜單
jPopupMenu1.show(this,e.getX()+20,e.getY()+20);
}
}
//添加好友菜單選中
void mnItemAddFriend_mousePressed(MouseEvent e)
{
//打開添加好友窗口直接根據(jù)JIM號添加好友
AddFriend addFriend=new AddFriend(this,-1); //-1表示需要顯示界面
addFriend.setLocationRelativeTo(this);
addFriend.show(); //顯示添加好友窗口
}
//收發(fā)訊息菜單選中
void mnItemMsg_mousePressed(MouseEvent e)
{
int index;
index=jlstFriend.getSelectedIndex(); //得到好友序列
if((index>=0)&&(((Friend)myFriends.get(index)).fOnline==1))
{
((Friend)myFriends.get(index)).showMessageDlg(this);//顯示通訊窗口
}
}
//刪除好友菜單選中
void mnItemDelFriend_mousePressed(MouseEvent e)
{
int index;
index=jlstFriend.getSelectedIndex(); //得到好友序列
if(index>=0)
{
try
{
Socket socket;
BufferedReader in;
PrintWriter out;
socket=new Socket(InetAddress.getByName(serverName),serverPort);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
//向服務器端發(fā)送刪除好友請求
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();
}
}
//以下為線程的線程體,無限監(jiān)聽好友發(fā)來的消息
public void run()
{
while(true)
{
try
{
byte[] data;
//將接收數(shù)據(jù)緩沖區(qū)數(shù)據(jù)置空
for(int i=0;i<512;i++)receiveBuf[i]=0;
//接收數(shù)據(jù)
receiveSocket.receive(receivePacket);
data=receivePacket.getData();
String messageStr=new String(data,0,receivePacket.getLength());
messageStr.trim();
//將接收到數(shù)據(jù)轉(zhuǎn)換成消息格式
Message msg=new Message(mwssageStr);
//以下為在好友列表中查找發(fā)來消息的好友是誰,在列表中的位置
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/"+faceOnline[((Friend)myFriends.get(index)).
fFace-1])},index);
((Friend)myFriends.get(index)).fOnline=0;
}
}
else if(msg.commandWord.equals("MESSAGE"))
{
Calendar cal;//創(chuàng)建日歷對象
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)+"秒";
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();}
}
}
}
class MessageDialog extends JDialog
{
int myImNo;
Friend myFriend;
Jpanel jpBottom=new JPanel();
JScrollPane jspMsgLog,jspSendMsg;
JTextArea jtaMsgLog=new JTextArea();
JTextArea jtaSendMsg=new JTextArea();
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 JScrollPane(jtaMsgLog);
jtaMsgLog.setText(myFriend.messageLog);
jspMsgLog.setBounds(6,6,380,400);
jspSendMsg=new JScrollPane(jtaSendMsg);
jspSendMsg.setText(6,410,280,45);
jbSend.setText("發(fā)送");
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_mouseClickde(MouseEvent e)
{
try
{
Calendar cal;//創(chuàng)建日歷對象
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)+"秒";
msgStr+="\n[我]";
msgStr+=str;
msgStr+="說:\n";
msgStr+=jtaSendMsg.getText().trim();
myFriend.messageLog+=msgStr;
jtaMsgLog.append(msgStr);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -