OnlyChat通信遇到的问题小结:
客户端之间通信(单聊)
客户端1发送消息给客户端2,结果最后的结果是客户端1又收到了自己发送的消息,造成这种现象的原因:
解决上述问题前谈谈我发送消息的机制:客户端1与客户端2进行聊天,服务器端的处理线程Server_Thread先调用客户端1的ServerSocket(线程连接对象)读取客户端1发来的消息,
然后,服务器调用客户端2的服务器连接线程(Server_Thread),之后就调用发送消息的方法将消息发送出去。
之所以,客户端1收到自己发送的消息是因为:虽然,调用的是客户端2的服务器端处理线程将消息发送给客户端2的客户端,但在发送消息的时候,却用的客户端1的数据输出流DataOutputStream对象,所以客户端1充当收发消息的角色。
<!--[if !supportLists]-->2.<!--[endif]-->多个客户端给同一个客户端发送消息遇到的问题
假如:客户端2,客户端3给客户端1发送消息
现象:只要是单纯的客户端2或者是客户端3与客户端1互发消息是没有问题的,但是当客户端2,与客户端1同时存在并且是给客户端1发送消息这是就出现了问题,客户端2,客户端3发消息给客户端1客户端1收到消息同时弹出多个聊天框。
分析:消息聊天框弹出机制:客户端1与客户端2聊天,当客户端2不存在的时候就实例化一个客户端2的聊天窗体,并且把该聊天窗体加入到自己的聊天窗体队列中。
看下产生上述现象的代码:
MsgOnly_Chat onlyChat = (MsgOnly_Chat)mHead;//单聊的消息对象
//得到保存聊天界面的链
List<ChatUI> chaList = getChatList();
Int len = chaList.size();
If(len == 0){
LogHelper.true_Info(MainUI.class, "!-----+++聊天窗体不存在。。。");
UserInfo myInfo = this.myInfomation(onlyChat.getFrom_User());//显示到聊天窗体的我的信息
//实例化聊天窗体(我的登录信息,客户端对象)
ChatUI cUI = new ChatUI(this.getuByMyself(),this.getClient());
//将实例化的界面添加到聊天界面的链表中
cUI.setNodeAccount(onlyChat.getFrom_User());//对方的聊天窗体有我的账号
this.addChatUI(cUI);
cUI.chatGUI(myInfo);
cUI.getShow_cont().append(msg);//显示聊天的消息
}Else If(len > 0){
For(int i=0;i<len;i++){
if(chaList.get(i).getNodeAccount() == onlyChat.getFrom_User() )
chaList.get(i).getShow_cont().append(msg);
}else{
//上述聊天窗体不存在的方法一致
}
}
分析原因:客户端2与客户端1发消息时,这时客户端1的聊天窗体的队列中已经有连个聊天窗体了(客户端1对客户端2(先),客户端1对客户端3(后)),所以毋庸置疑客户端1聊天队列chaList.get(0)==2的聊天窗口,chaList.get(1)只能是3的聊天窗口,从每次执行循环看,都是从0开始,所以每次判断信息的时候得到总是2的聊天窗口,所以3的聊天窗口每次都不存在,所以客户端3给客户端1发消息时,对于客户端1来说3的聊天窗体都是不存在的所以每发一条消息都要创建一个基于客户端1的3聊天窗体,如果是4个,5个,甚至更多个客户端与同一个客户端通信遇到问题都是一样的
解决问题:判断聊天窗体存在与否,就是要遍历整个客户端的聊天窗体,如果该聊天窗体对应的账号(用户登录账号,标识不同聊天窗体)与消息发送方的账号不一致,就实例化窗体,反之,直接把消息显示到已经存在的窗体上即可。
代码:
//查找聊天窗链表,判断聊天窗体是否存在
public int seekList(List<ChatUI> list, int account){
for(int i = 0; i < list.size(); i++){
if(list.get(i).getNodeAccount() == account)
return i;
}
return -1;
}
//得到保存聊天界面的链表
List<ChatUI> chaList = getChatList();
LogHelper.true_Info(MainUI.class, "保存聊天窗体的队列:::"+chaList.size()+" 客户端窗体主界面的ID:"+this.getMainAccount());
int index = this.seekList(chaList, onlyChat.getFrom_User());//返回聊天窗体在队列中的位置
if(index != -1){//窗体存在
chaList.get(index).getShow_cont().append(msg);
}else{
LogHelper.true_Info(MainUI.class, "!-----+++聊天窗体不存在。。。");
UserInfo myInfo = this.myInfomation(onlyChat.getFrom_User());//显示到聊天窗体的我的信息
//实例化聊天窗体(我的登录信息,客户端对象)
ChatUI cUI = new ChatUI(this.getuByMyself(),this.getClient());
//将实例化的界面添加到聊天界面的链表中
cUI.setNodeAccount(onlyChat.getFrom_User());//对方的聊天窗体有我的账号
this.addChatUI(cUI);
cUI.chatGUI(myInfo);
cUI.getShow_cont().append(msg);//显示聊天的消息
}
<!--[if !supportLists]-->3.<!--[endif]-->就该练习的总结java中的封装
不多说封装是java的一个特征之一,封装有利于扩展性,便于修改代码,而且还有利于外部类的调用。。。
具体:
以写的搜索注册用户的界面为例:
搜索用户的界面组成:北边面板和南边面板组成,北边面板的主要功能是输入注册的用户的账号(账号可以模糊查询)查询出注册的用户的账号以及昵称显示到南边面板的表格中。。。很明显,按照程序的执行流程以及逻辑思路,我们的搜索界面先实例化了,而南面面板要显示的注册用户的数据必须要等到点击搜索按钮才能得到。。。此时怎么解决这个问题呢?当然你可能会想到在点击搜索按钮后再实例化一次搜索界面然后将得到的数据显示到南边面板的表格中就可以了。。。
这样做也是一种解决办法,但我认为不可行,加入说你的项目中出现了多个这样的情形,无意耗费了很多内存空间,这样你的程序也会报错。
解决办法:我想的是南边面板封装成为一个方法,第一次实例化的时候该类对象不调用生成南边面板的方法,当点击搜索按钮的时候只需要将请求发送给服务器,服务器响应的时候返回了注册用户信息的队列。。。我的所有客户端响应都是在主界面(MainUI)中完成的,第一次打开搜索界面也是在该MainUI界面中完成的,所以只需拿到该类中搜索界面的对象后调用生成南边面板的方法,将注册用户数据作为参数,然后显示到南边面板即可。。。这样也就解决了一个对象多次实例化的问题。。。
这就是上述问题的截图,我只是从遇到的问题中分析了一下封装的好处。。。
相关推荐
移动通信是现代通信技术的重要组成部分,它涉及到许多关键概念和技术,包括信令、移动通信、接入信令、网络信令以及各种多址接入技术。在移动通信中,信令是控制通信过程的关键,分为接入信令(如移动台与基站之间的...
PROFINET通信技术总结
串口通信项目总结 本篇资源的主要内容是对多串口接收项目的总结,涵盖技术总结和心得总结两方面。下面将对标题、描述、标签和部分内容进行详细的解释和总结。 一、技术总结 技术总结是对整个项目的技术实现过程的...
通信原理答案和总结 通信原理答案和总结 通信原理答案和总结 通信原理答案和总结 通信原理答案和总结
总结来说,这个实验涵盖了TCP通信基础、MFC中的套接字编程以及异步通信模式的应用,通过服务端和客户端的互动,实现文本字符串的实时传输。这样的实践有助于开发者深入理解网络编程,特别是TCP通信的异步特性,提升...
关于通信原理的一点总结。。。。。个人学习的心得!
通信原理期末考试内容总结,《通信原理》是2010年哈尔滨工业大学出版社出版的图书,作者是江晓林,杨明极,课程是通信、电子、信息领域中重要的专业基础课,是电子信息系各专业必修的专业基础课,本书讲述模拟通信和...
通信认识实习是大学阶段一个至关重要的实践环节,旨在让学生在专业学习前对通信行业有初步的了解和体验。2014年中南大学通信工程专业的学生在广州讯联通信工程公司湖南分公司进行了为期一周的实习,通过实地参观、...
### 电力系统通信相关知识总结 #### 一、基本概念 1. **通信系统**:指从信息源头至信息终点间的信息传输全过程所涉及的所有硬件设备的集合,其中包括终端设备和连接这些设备的传输线路。 2. **通信网**:是由...
物联网通信原理知识的一些总结,物联网通信原理知识的一些总结。
关于通信原理的总结,不错,学习一下。总结各章节的主要内容和主要知识点。
"通信电子线路总结习题考试重点" 通信电子线路是电子工程领域中的一个重要分支,涉及到信号传输、电子线路设计、通信系统等方面。本资源总结了通信电子线路的重要知识点,涵盖了传输线、电感、电容、谐振回路、放大...
对通信原理实验课做了感想性总结,方便学生写实验报告
别人自己写的总结,内容是常用进程间通信方法及函数
本篇文章将深入探讨“服务通信方案总结”,主要包括服务端的实现、客户端通过AIDL(Android Interface Definition Language)进行进程间通信、Activity与Service之间的通信以及Parcel的使用和接口回调机制。...
通信原力的一些个人理解,总结 对一般通信系统的描述
这份“关于西门子常用通信文档总结个人出品.pdf”很可能包含了对西门子通信协议、网络结构、通信设备以及常见问题解决方法的详细解析。以下是根据这些信息可能涵盖的一些关键知识点: 1. **西门子通信协议**: - *...
移动通信是现代通信技术的重要组成部分,它涉及到在移动设备之间或移动设备与固定点之间的信息传输。移动通信的核心特点是利用无线电波在复杂环境中的传播,同时处理有限的频谱资源和日益增长的业务需求。根据工作...
【请用OneNote打开】北京理工大学《通信电路与系统》课程复习资料。主要包括: · 期末复习提纲; · Chap01 通信概论; · Chap02 谐振功率放大; · Cahp03 振荡电路; · Chap04 幅度调制、解调和混频电路; · ...
"移动通信复习总结" 移动通信是指通信双方或至少有一方处于运动中进行信息传输和交换的通信方式。它的发展经历了多代,包括第一代模拟通信系统、第二代数字蜂窝移动通信系统和第三代数字蜂窝移动通信系统。 移动...