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

📄 jim.java

📁 照书上做的JIM软件,不过不知道为什么还不能运行.要是能调出来功能绝对完善
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
		  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 + -