复习Java第二个项目仿QQ聊天系统 06(发送接收消息功能完善) &Java面试题HashMap的put方法实现原理&生活【记录一个咸鱼大学生三个月的奋进生活】028

本文详述了使用Java实现QQ聊天系统中发送和接收消息功能的完善过程,包括UdpThread接收线程、MainFrame的双击发送、SendFrame及ReceiveFrame的逻辑。同时探讨了HashMap的put方法实现原理,为面试做准备。还分享了一张摄影作品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习Java(仿QQ聊天系统06发送接收消息功能完善)

  今天我们来完善发送消息界面和接收消息界面的功能,之前静态页面在这个文章中已经介绍过了:复习Java第二个项目仿QQ聊天系统 01(界面部分),今天我们来写发送和接收消息功能的实现

UdpThread类(接收信息、以防阻塞)

  这个类会在MainFrame中使用,当接收到信息时就触发,可以处理消息接收,还是个线程以防阻塞

package com.qq.listener;

// 以防阻塞的UdpThread,这个类同时有三个作用,1:是个线程可以处理多个消息发送,2:用观察者模式实现事件,3:还通过UdpSocket实现发送消息

import com.qq.pub.UdpSocket;

public class UdpThread extends Thread {
   
	
	private UdpSocket udpSocket = null;
	private UdpListener l = null;
	
	
	// 重写构造方法将udpSocket作为参数传入
	public UdpThread() {
   
		// TODO Auto-generated constructor stub
	}
	public UdpThread(UdpSocket udpSocket) {
   
		this.udpSocket = udpSocket;
	}
	
	
	// addUdpListener方法获得事件处理l,当有好友登录就会实例化udpSocket传输信息然后就会触发
	public void addUdpListener(UdpListener l) {
   
		this.l = l;
	}
	
	
	// 重写线程的run方法
	@Override
	public void run() {
   
		while(true) {
   
			String udpInfo = this.udpSocket.receive();          // 获得udpSocket接收到的信息
			this.l.exectue(udpInfo);                            // 并将接收到的信息作为参数传给事件处理的l
		} 
	}
}

MainFrame主页面中 双击好友发送消息的代码

  然后回顾一下昨天在MainFrame主页面中写到过的怎么双击好友发送消息的代码,来看下实例化SendFrame(发送框)时都传入了什么参数

// 当左键双击好友时就实例化发送消息的窗体,这后面都是MouseListener接口的实现方法,我们只用的上这个点击事件,所以只重写这个方法
	@Override
	public void mouseClicked(MouseEvent e) {
   
		if(1 == e.getButton() && 2 == e.getClickCount()) {
   
			Qquser receiver = this.friendList.getSelectedValue();
			SendFrame sendFrame = new SendFrame(this.fullUser, receiver);
			sendFrame.setVisible(true);
		}
	}

  可以看到我们在发送消息时传入了发送者对象的信息和接收好友的对象的信息

SendFrame发送消息框功能完善

  这个类中要注意,当你发送消息时发出去的其实是一个报文,报文头为MESSAGE标记,然后是发送者的用户名和发送的消息,这都是会在接收信息时用到的

package com.qq.ui;

// 发送消息的页面

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import com.qq.bean.Qquser;
import com.qq.pub.CommonUse;
import com.qq.pub.UdpSocket;

public class SendFrame extends JFrame implements ActionListener {
   
	private Qquser sender = null;
	private Qquser receiver = null;
	
	private JPanel topPanel;
    private JPanel bottomPanel;
    
    private JLabel receiverLabel = null;
   	private JTextField receiverField = null;<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aspiriln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值