闲暇之余基于Java Swing自己写了一个即时聊天软件LL,源码地址:https://github.com/nmyphp/msn532.git。欢迎大家一起改进。
一、遇到的异常及解决办法
1. org.hibernate.HibernateException:Could not parse configuration: /hibernate.cfg.xml
..省略
Caused by: org.dom4j.DocumentException: www.hibernate.orgNested exception: www.hibernate.org
解决办法:这是因为没有联网
2. hibernate配置联合主键,被联合的各个字段必须加“insert=”false””属性,否则会字段重复插入,导致异常
<class name="AddFriend"table="msn_addfriend" catalog="newmsn">
<composite-id>
<key-propertyname="requestSenderId"></key-property>
<key-propertyname="requestReceiverId"></key-property>
</composite-id>
<propertyname="requestSenderId" type="java.lang.Integer"insert="false">
<columnname="requestSenderID"></column>
</property>
<propertyname="requestReceiverId" type="java.lang.Integer" insert="false">
<columnname="requestReceiverID"></column>
</property>
</class>
二、项目中遇到的难题及解决办法
1. 在好友列表中,怎么使用JList做出类似QQ那样的列表项(既有图片也有文字)
解决办法:重写ListCellRenderer类,自己实现JList中的对象的表现效果,否则只能显示字符串,具体如下:
主要是重写getListCellRendererComponent这个方法,你可以在这个类中显示JLabel等其他组件,value就是你加入到JList中的对象。最后用调用JList的setCellRenderer方法设置它的渲染器。
2. 怎么实现在一台电脑上可以登录多个客户端,并且他们之间正常通讯
解决办法:大家肯定知道通过端口号,但是仅仅是在每次创建客户端的时候,port++是不行的。我的解决办法是通过读写文件,每次创建新的客户端的时候就从文件中读取一个端口号,然后port++,再把port++写入文件,以便下一次读到的与这次不同。
3. 怎么实现一个客户端同时打开多个聊天窗口,而且接收消息互不干扰
解决办法:每个聊天窗口再设置一个ID,唯一标示该窗口,然后用一个Map储存这些窗口,key是窗口ID,element是窗口,这样每次接收到消息时,遍历这个Map,找到对应的窗口,将消息传给他。
4. 每个客户端的ip不一样,而且不同时间也可能不一样,比如我在学校,ip是随机分配的,不可能每个客户端储存一份所有其它客户端的ip。怎么实现他们之间的通讯呢?
解决办法:通过服务器转发消息。每次一个客户端登录时,就把自己的ip和端口号发给有固定ip和端口号的服务器,服务器用Map存起来,key是客户端的用户(登录客户端的User)的ID,element是客户端的ip和端口号。这样当有一个用户给另一个用户发消息时,就发给服务器(要表示发给哪一个User),服务器在Map中查找那个客户端的登录信息,然后把消息发给那个客户端。