📄 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 + -