⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jim.java.bak

📁 照书上做的JIM软件,不过不知道为什么还不能运行.要是能调出来功能绝对完善
💻 BAK
📖 第 1 页 / 共 3 页
字号:
 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("收发讯息");
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);
		   //向服务器端发送登记接收信息的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);
                	sengSocket.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()));
		  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(mwssageStr);
			
			//以下为在好友列表中查找发来消息的好友是谁,在列表中的位置
			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;//创建日历对象
	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("发送");
		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;//创建日历对象
	    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 + -