您的位置:首页 > 其它

模拟QQ-Socket通信线程项目总结

2011-10-31 05:10 357 查看
前言

大家好,这是本人第一次写技术贴,希望看到的人能多提意见,多多指正……希望能和大家同道中人共同进步……

这个项目是模拟QQ通讯,现在就将我在学习这一块的时候就项目本身的开发过程,遇到的一些问题及处理措施跟大家做一个分享……

因为是第一个项目,学习了差不多一个多月的基础,就开始做了,所以做的比较简单,没有涉及数据库,实现的功能也不多,就是简单的几个Swing界面,加上Socket通讯,实现了好友在线显示,好友之间能够互聊功能,虽然简单,但毕竟是自己的第一个项目,做出来还是蛮有成就感的,嘿嘿,见笑~~~~~

首先是Swing界面

这个比较简单,就三个界面,一个登录LoginFrame界面,一个是好友显示MainFrame界面,再一个就是聊天窗口ChatFrame界面,这个我觉得是我做这个项目的时候最简单的了,花了不到一个小时就做出来了~~~~

业务逻辑结构分析

这块一定要搞清楚了,听老师说,自己以前的学习也会明显的感觉到,如果你写个东西业务逻辑不是很清楚的话,没有搞清楚什么是干什么的,很容易在后面写的时候写着写着就不知道该干什么了

QQ的业务逻辑就根据Socket来分析,一个服务端,多个客户端。客户端负责登录跟服务端取得联系,服务端将此标注为在线用户,它可以和其它在线用户之间相互发送数据,这个就是它向服务端发送数据,然后服务端根据它要发给哪个在线用户将它发过来的消息转发给那个用户……基本上就是这样了吧,我们做的也就实现了这么多功能

具体模块分析

首先说客户端,客户端就是我们用户用的界面,我们首先需要一个帐号(当然为了容易实现起见,我简单的设置了下只要密码是123456,帐号随便),在你登录的时候,你的名字会显示在你好友界面的窗体名称上,当然,这个地方所谓的好友就是所有在线登录的用户,服务器会遍历显示到你的好友界面上,然后你就可以和这些在线用户开始数据通信了……当你双击某个在线用户的时候,弹出跟该用户聊天的窗口,点击聊天窗口的发送按钮,就会将“你,你聊天的对象,你发送的数据”一带发给服务端……当某人给你发消息的时候,也是弹出你跟他的聊天窗口,然后显示他发给你的消息……

嗯,基本上就是这样子了,说的有点啰嗦,但这不是新手嘛,才入门,写清楚点不至于到后面晕掉……嘿嘿

再说服务端,服务端接收到客户端发过来的数据的时候要进行处理,想发过来的聊天数据,你要判断是谁发给谁的,发的什么数据,再发送个相应的那个人,这中间不能出错,不然不是发不过去,就是乱发了……你想想,你登上QQ了,收到了一堆乱七八糟别人发错的消息,哈哈,那腾讯就要关门大吉咯~~~

编程小经验

第一次实现的时候虽然逻辑搞清楚了,可是写代码的时候代码逻辑还是不怎么清楚,就分了两个包,一个放Server,一个放Client,写到后面乱七八糟的一大推,一个Class里面既有显示界面的,又有处理数据的,出错的时候该起来很困难,所以后面写的时候直接就分了两个Project,一个放Server,一个放Client,每个里面还有好几个package,简单的应用了MVC模式,将界面显示和数据处理分离开始,界面管界面,处理数据处理数据,这样什么地方出错了,也很好找,便于代码维护……

那就说的这么多吧,第一次写这些总结的东西,不知道是说的太详细还是有点粗陋,或者说了有些非重点,还请大家多给点意见,嘿嘿,谢谢……

再就是将自己写的一些代码贴上让大家看看

要有这个阶段也有做这个的项目的大家可以交流交流……

public void run(){
try {
BufferedReader reader=
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
while(true){
String data = reader.readLine();
System.out.println(data);
if (data.startsWith("LOGIN_")) {//登陆消息
data = data.substring(6);//处理消息
Server.addOnlines(data, socket);//加入Map
Server.writeMessageToAll("LOGIN_"+data+"登陆了!");//发送登陆消息
Server.sendOnlinesList();//发送在线人员

}
if (data.startsWith("CHAT_")) {//聊天消息
String[] tempArray = data.split("_");
String from = tempArray[1];//from
String to = tempArray[2];//to
String message = tempArray[3];//message
if (to.equals("所有人")) {
Server.writeMessageToAll("CHAT_"+from+"_"+message);
}
else {
Server.writeMessageToOne(to, "CHAT_"+from+"_"+message);//密聊
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: