?在Socket和ServerSocket通信的应用上,挑选了聊天来进行深入练习.
这是第一个版本,暂时实现了基本的登录,群聊,私聊,同步联系人列表等功能.
这里简化了很多功能,所有在线用户就是一个群,私聊还存在一点问题将在下版本修复.先写个总结,记录自己的开发思路,也给初学者一个参考.
?
第一步,写一个窗口,上面放两个文本框用来输入账号密码.还有一个登陆按钮.在这里直接用JTextField.它可以直接监听回车键产生动作.
?
第二步,点击登录或者按了回车就需要和服务端进行通信,首先做一个最简单的打印测试是不是联通了.
?
第三步,点击登录之后就弹出新的窗口.上面有一个列表显示当前在线的联系人,并且双击其中一个就打开私聊窗口.如果点击群图标就开始群聊.
?
第四步,在之前的基础上,加入账号登录时候检查,必须账号密码存在于服务器并且账号密码配对才可以正常登录.这里用HashMap来记录.
HashMap<int(号码),User(账户,包括这个账号的号码,密码,昵称,个性签名,性别,年龄等等)>
同时也要用HashMap保存所有已经注册了的账户的信息.
?
第五步.把界面做的美观一点.
?
代码实现过程:
写一个收发消息的工具,专门负责收发消息,并且在里面定义好传输用到的协议,用来区分收到的是一个登陆消息还是注册消息,还是私聊消息,还是群聊等等.
所以同样需要一个消息类,里面包含4个属性,一个是type,一个是senderNum,一个是receiverNum,一个是content(Object).
?
然后需要一个用户类User,用来保存一个账号需要的一些信息
?
接下来开始写客户端连接之后启动线程来接收消息.并new出相应的ChatUI
?
在服务器进行各种消息的处理.
对包括登陆时验证密码是否正确,账号是否存在,将在线联系人列表发给新登录的客户端等等之类的消息进行处理.
?
里面也有许多细节问题需要注意,参见之前写的几篇异常和各种小功能实现的总结.
附上如果获得当前时间的代码:
?
class="java" name="code">public String getTime() { // 创建时间对象 long time = System.currentTimeMillis(); Date date = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("y/M/d HH:mm:ss"); return sdf.format(date); }
?
现版本存在的问题:
?
键盘监听器回车发送消息有问题
需要用map存起来号码对应的聊天窗口对象,不然每个人的私聊记录都会显示在一起
最大化->最小化->最大化->恢复正常窗口 ?有点小问题.将在下个版本再解决.
传文件未实现
?
?
附上效果图和代码:
代码逻辑比较简单.主要是客户端发了个什么消息,服务器就做出相应的反应,服务器发了个什么消息,客户端又做出相应的反应.
?
?
?
?
?
所有代码(内附说明和QQ美化的素材)
?
?
?