package com.jwt.client;
import com.jwt.entity.Message;
import com.jwt.entity.MessageType;
import com.jwt.entity.User;
import com.jwt.view.ChatRoom;
import com.jwt.view.ManageChatRoom;
import com.jwt.view.OnlineView;
import javax.swing.*;
import java.io.*;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* @author:gd_jwt
* 处理Message类型消息的线程
*
*/
public class AnswerMessageThread extends Thread{
private static int answerCount=0;//已读下标
private static DatagramSocket datagramSocket=null;
private User user = null;//本客户端用户
private static boolean b=true;//标记,用于退出线程
public AnswerMessageThread(DatagramSocket datagramSocket,User user) {
this.datagramSocket = datagramSocket;
this.user=user;
System.out.println("已开启消息处理线程(端口为:"+datagramSocket.getLocalPort()+")");
}
@Override
public void run() {
while(b){
try {
//获取接收Message的集合
List<Message> messageList = ReceiveMessageThread.getMessageList();
//当已读下标小于集合的元素个数时,表明有新的消息未处理
if(answerCount<messageList.size()){
//有新的消息时才调用
doAnswer(messageList);
}
sleep(20);//每隔20ms读取一次消息集合
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* 处理消息的方法,根据消息的不同类型进行不同的响应
* */
public void doAnswer(List<Message> messageList) throws IOException {
//本客户端用户Id
String uId = user.getUserId();
//回复给客户端的消息
Message retMes=new Message();
int temp=0;
for(temp=answerCount;temp<messageList.size();temp++){
Message message = messageList.get(temp);
User sender = null;
String senderId = "";
//规定除了服务器发送的Message消息,其他客户端发送的和服务器转发的群聊消息都要设置sender
sender = message.getSender();
if(sender!=null){
senderId = sender.getUserId();
}
//根据消息的不同类型进行不同的响应
switch (message.getMesType()){
/*返回在线用户*/
case MessageType.MESSAGE_RET_ONLINE_USER:{
//取出message里的在线用户集合
List<User> onlineUsers = message.getOnlines();
//初始化在线用户界面
OnlineView onlineUserView = new OnlineView(datagramSocket, onlineUsers.size());
onlineUserView.setTitle("在线用户列表");
for (User onlineUser : onlineUsers) {
//在线用户Id
JLabel jId = onlineUserView.initJId(onlineUser.getUserId());
//添加好友按钮
JButton jAddFri = onlineUserView.initAddFri(user, onlineUser.getUserId());
onlineUserView.add(jId);
onlineUserView.add(jAddFri);
}
//显示在线用户界面
onlineUserView.setVisible(true);
break;
}
/*返回在线好友*/
case MessageType.MESSAGE_RET_ONLINE_FRIEND: {
//取出message里的在线好友集合
List<User> onlineFriends = message.getOnlines();
//初始化在线好友界面
OnlineView onlineUserView = new OnlineView(datagramSocket, onlineFriends.size());
onlineUserView.setTitle("在线好友列表");
for (User friend : onlineFriends) {
//调用方法检查该好友对应的聊天室有没有被创建
ChatRoom chatOne = chatRoomIsInHm(friend);
//在线好友Id
JLabel jId = onlineUserView.initJId(friend.getUserId());
//好友私聊按钮
JButton jSendMes = onlineUserView.initSendMes(chatOne, uId, friend.getUserId());
//发送文件按钮
JButton jSendFile = onlineUserView.initSendFileMes(chatOne, user, friend);
onlineUserView.add(jId);
onlineUserView.add(jSendMes);
onlineUserView.add(jSendFile);
}
//显示在线好友界面
onlineUserView.setVisible(true);
break;
}
/*添加好友成功提示*/
case MessageType.MESSAGE_ADD_ONLINE_FRIEND: {
//添加好友成功提示
JOptionPane.showMessageDialog(null, "添加成功!",
"提示窗口", JOptionPane.INFORMATION_MESSAGE);
break;
}
/*收到普通文本消息*/
case MessageType.MESSAGE_COMM_MES: {
//取出发送者的聊天室
ChatRoom chatOne = chatRoomIsInHm(sender);
//取出消息的文本内容,写入聊天框中
chatOne.getTextArea().append(senderId+": "+message.getContent()+"\r\n");
//显示聊天界面
chatOne.setVisible(true);
ChatService.sendTextMes(datagramSocket,retMes,InetAddress.getByName(sender.getUserIp()),sender.getPort());
break;
}
/*第一次加入聊天室成功提醒*/
case MessageType.MESSAGE_ADD_TO_ALL:{
//服务器发送提醒确认后,客户端才创建群聊聊天室
ChatRoom chatRoom = new ChatRoom(datagramSocket);
//设置按钮为群发消息
chatRoom.chatMoreView();
//指明用户为自己,即发送者为自己
chatRoom.setUser(user);
chatRoom.setTitle("多人聊天室("+user.getUserId()+")");
//规定设置聊天室名称为“ALL",代表群聊
ManageChatRoom.addRoom("ALL",chatRoom);
//显示聊天室
chatRoom.setVisible(true);
//第一次加入聊天室时提示
JOptionPane.showMessageDialog(null, "加入聊天室成功!",
"提示窗口", JOptionPane.INFORMATION_MESSAGE);
break;
}
/*收到群聊消息*/
case MessageType.MESSAGE_TO_ALL_MES: {
//取出群聊聊天室
ChatRoom chatAll = ManageChatRoom.friIdgetChatRoom("ALL");
//取出消息的文本内容,写入聊天框中
chatAll.getTextArea().append(senderId+": "+message.getContent()+"\r\n");
//显示聊天界面
chatAll.setVisible(true);
break;
}
/*
* 收到发送文件请求。如果同意接收,规定接收方要回复新的接收端口
* 同意接收后开启新的线程,在新的端口进行接收,避免冲突
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
UDP协议在IP协议之上添加的功能虽然非常有限,但UDP通信比面向连接的协议更高效,适合每次发送的数据量小,但发送频繁的通信;UDP数据报首部短小,建立和处理首部信息花费的时间短,适合实时或要求延迟非常低的通信;在UDP通信中,一个数据报可以同时发往多个接收者,适合1对多的通信。通过完成本实验项目,巩固以前所学的面向对象的分析和设计技术,掌握UDP套接字的编程范型,熟悉Java对UDP协议的支持类的编程接口,并能熟练运用于UDP协议应用编程中。
资源推荐
资源详情
资源评论
收起资源包目录
广州大学网络编程实验二代码(UDP编程) (109个子文件)
AnswerMessageThread.class 8KB
AnswerMessageThread.class 6KB
MenuView.class 4KB
LoginView.class 4KB
ChatRoom.class 4KB
ManagerUsers.class 4KB
SendFileThread.class 3KB
OnlineView$3.class 3KB
UserClientService.class 3KB
ChatServer.class 3KB
ChatService.class 3KB
OnlineView.class 3KB
ReceiveFileThread.class 3KB
ChatRoom$2.class 2KB
ChatRoom$3.class 2KB
ChatRoom$4.class 2KB
ReceiveMessageThread.class 2KB
ReceiveMessageThread.class 2KB
ChatRoom$5.class 2KB
Message.class 2KB
Message.class 2KB
User.class 2KB
OnlineView$1.class 2KB
User.class 2KB
DButil.class 2KB
OnlineView$2.class 1KB
FriendServiceImpl.class 1KB
ManageChatRoom.class 1KB
MenuView$1.class 1KB
UserServiceImpl.class 1KB
MessageType.class 896B
MessageType.class 896B
ChatRoom$1.class 684B
Test.class 432B
FriendService.class 325B
FriendMapper.class 322B
ServerData.class 314B
ServerData.class 314B
UserService.class 232B
UserMapper.class 229B
.gitignore 0B
.gitignore 0B
UDPServer.iml 502B
UDPClient.iml 433B
mysql-connector-java-8.0.19.jar 2.25MB
ant-1.10.3.jar 2.1MB
mybatis-3.5.2.jar 1.62MB
log4j-core-2.11.2.jar 1.55MB
javassist-3.24.1-GA.jar 759KB
log4j-1.2.17.jar 478KB
cglib-3.2.10.jar 300KB
log4j-api-2.11.2.jar 260KB
ognl-3.2.10.jar 244KB
asm-7.0.jar 111KB
commons-logging-1.2.jar 60KB
slf4j-api-1.7.26.jar 40KB
ant-launcher-1.10.3.jar 18KB
slf4j-log4j12-1.7.26.jar 12KB
AnswerMessageThread.java 12KB
AnswerMessageThread.java 8KB
ChatRoom.java 7KB
OnlineView.java 6KB
LoginView.java 5KB
MenuView.java 5KB
UserClientService.java 4KB
ChatServer.java 3KB
SendFileThread.java 3KB
ManagerUsers.java 3KB
ReceiveFileThread.java 3KB
ChatService.java 3KB
ReceiveMessageThread.java 2KB
ReceiveMessageThread.java 2KB
User.java 2KB
Message.java 2KB
Message.java 2KB
User.java 2KB
MessageType.java 1KB
DButil.java 1KB
MessageType.java 1KB
FriendServiceImpl.java 904B
UserServiceImpl.java 816B
ManageChatRoom.java 776B
ServerData.java 410B
FriendService.java 317B
FriendMapper.java 316B
ServerData.java 311B
UserService.java 281B
UserMapper.java 278B
Test.java 236B
UDPClient.kotlin_module 16B
log4j.properties 680B
log4j.properties 680B
jdbc.properties 191B
jdbc.properties 191B
uiDesigner.xml 9KB
uiDesigner.xml 9KB
workspace.xml 8KB
workspace.xml 4KB
ant_1_10_3.xml 1KB
mybatis.xml 1024B
共 109 条
- 1
- 2
资源评论
我曾婉拒佘颖欣
- 粉丝: 23
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功