📄 jim.java
字号:
{
this.dispose();
System.exit(0);
}
//处理窗口的关闭事件
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING){
System.exit(0);
}
}
}
//JimWin类
//JIM主界面类。该类通过列表显示出好友及好友的状态,并通过快捷菜单的方式提供收发信息、查看好友资料、增加好友和删除好友的功能。代码如下:
class JimWin extends JFrame implements Runnable
{ int myImNo; //本人的JIM号
Vector myFriends=new Vector();//好友的列表
String[] faceOnline; //在线时好友图像文件名
String[] faceOffline; //离线时好友图像文件名
Thread thread; //接收信息线程
//以下是网络相关变量
String serverName; //服务器名或IP地址
int serverPort; //服务器端口号
byte receiveBuf[ ]=new byte[512]; //UDP方式接收数据的数据缓冲区
DatagramPacket receivePacket; //接收数据报Packet
DatagramSocket receiveSocket; //接收数据报Socket
//默认接收消息的UDP端口号。
//若在同一台计算机上启动多个JIM端口号将自动加1
int udpPORT=5001;
//以下是程序界面的变量
JPanel contentPane;
JScrollPane jspList; //滚动面板
JList jlstFriend; //好友列表,将放置在滚动面板上
JPopupMenu jPopupMenu1=new JPopupMenu(); //快捷菜单
JMenuItem mnItemMsg=new JMenuItem(); //收发讯息菜单
JMenuItem mnItemInfo=new JMenuItem(); //查看资料菜单
JMenuItem mnItemAddFriend=new JMenuItem(); //增加好友菜单
JMenuItem mnItemDelFriend=new JMenuItem();//删除好友菜单
//主程序构造方法
public JimWin(int s,String serverName,int serverPort)
{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try
{
myImNo=s; //得到自己的JIM号
this.serverName=serverName; //服务器名
this.serverPort=serverPort; //服务器TCP通讯端口号
mainWinInit(); //初始化界面
ConnectServer(myImNo); //连接服务器做登记工作和查询好友
thread=new Thread(this); //创建监视接收消息端口的线程
thread.start(); //启动监视接收消息端口的线程
}
catch(Exception e)
{
e.printStackTrace();
}
}
//初始化主程序界面
private void mainWinInit()throws Exception
{
//设置在线头像的图像文本过滤器
FilenameFilter fileFilterOn=new FilenameFilter(){
public boolean accept(File dir,String name){
if(name.endsWith("_1.JPG")||name.endsWith("_1.jpg")){
return true;
}
return false;
}
};
//设置离像头像的图像文件过滤器
FilenameFilter fileFilterOff=new FilenameFilter(){
public boolean accept(File dir,String name){
if(name.endsWith("_2.JPG")||name.endsWith("_2.jpg")){
return true;
}
return false;
}
};
//指定图像文件的目录在当前目录的face子目录下
File dir=new File("face");
//得到在线头像的图像文件列表
faceOnline=dir.list(fileFilterOn);
//得到离线头像的图像文件列表
faceOffline=dir.list(fileFilterOff);
this.getContentPane().setBackground(new Color(132,158,203));
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.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e){
jlstFriend_mouseClicked(e);
}
});
mnItemMsg.setText("收发讯息");
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端口号登记和查询好友信息等
public 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);
//向服务器端发送登记接收信息的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
{
//循环读取服务器端返回的好友信息,直到服务器端发送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"));
//向服务器发送查询哪些人加我为好友的请求
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方式向好友发送我在线消息
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);
sendSocket.close();
}while(!fIp.equals("OVER"));
//向服务器端发送终止通讯的请求
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);
}
//下面的方法用于创建用户接收信息的UDP数据报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; //创建成功
}
catch(SocketException se)
{
//若有异常说明该端口已经使用,于是循环端口号加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);
//向服务器发送查询谁加我为好友的请求
out.println("GETWHOADDME");
out.println(myImNo);
DatagramPacket sendPacket;
DatagramSocket sendsocket;
int sendPort=5000;
String fIp,fRPort,fImNo;
do
{
//获得好友的信息,直到服务器发送OVER消息
fIp=in.readLine();
if(fIp.equals("OVER")) break;
fRPort=in.readLine();
fImNo=in.readLine();
sendSocket=new DatagramSocket(sendPort);
//构造消息并通过UDP方式发出,该消息告诉好友我离线
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);
}
}
//好友列表框发生mouseClicked事件
void jlstFriend_mouseClicked(MouseEvent e)
{
if(e.isMetaDown()) //判断是否是鼠标左键
{
//显示快揭菜单
jPopupMenu1.show(this,e.getX()+20,e.getY()+20);
}
}
//添加好友菜单选中
void mnItemAddFriend_mousePressed(MouseEvent e)
{
//打开添加好友窗口直接根据JIM号添加好友
AddFriend addFriend=new AddFriend(this,-1); //-1表示需要显示界面
addFriend.setLocationRelativeTo(this);
addFriend.show(); //显示添加好友窗口
}
//收发讯息菜单选中
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()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -