2.验证用户名是否存在 在对象数据库中查找是否有与登录用户的用户名相同的记录,如果有继续验证,否则退出验证处理,返回“没有此用户”错误 用户登陆程序模块如下: if (reg.custName.equals(clientMessage2.custName)) { find = 1; if toClient.println(\密码不正确\); break; // 判断是否已经登录 int login_flag = 0; for (int a = 0; a < userOnline.size(); a++) { } if (userOnline.size() >= 50) { toClient.println(\登录人数过多,请稍候再试\); break; if } login_flag = 1; break; .elementAt(a)).custName; (!reg.custPassword.equals(clientMessage2.custPassword)) { } else { String _custName = ((Customer) userOnline (clientMessage2.custName.equals(_custName)) { 4.2.2.4用户退出
1.接收退出信息 当用户退出时,客户端将会用基于Socket的对象输出流发送给服务器退出对象。 2.在线列表中删除用户 用户退出后应该把用户从在线列表中删除,否则用户退出用户还在在线列表中,那么该用户下次将会无法登录。 3.更新在线列表 用户退出后将服务器端监控界面的用户列表更新。否则用户数据将会不同步。 用户退出模块程序: public void serverExit() { Exit exit = new Exit(); exit = (Exit) obj; removeUser(exit); // chenmin - 21 -
if (sFrame.ti.equals(exit.exitname)) { } Date t = new Date(); sFrame.ti = \; log(\用户\ + exit.exitname + \已经退出, \ + \退出时间:\ + t.toLocaleString()); freshServerUserList(); } 4.2.2.5 接收用户聊天信息 1.接收用户聊天信息
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象。 2.过滤用户聊天内容的非法信息
分析聊天信息对象的聊天内容,用语言过滤类将非法字符过滤掉。语言过滤的时候将会打开“badword.txt”文件,不允许出现的关键词将会存储在文件中,关键字之间以逗号分割。当聊天内容中出现要过渡的关键字是将会被系统屏蔽,而聊天内容
3.接收服务器端的系统消息 当有其他用户登陆时,系统会给在线的所有用户发送用户登陆信息,并且通过服务器可以给各用户发送系统消息。系统消息发出后,如再有登录者也可以接收到系统消息。 4.返回给客户端 当以上信息都封装成功后,打开与客户端连接的Socket的输出流,然后再用ObjectOutputStream对象输出流包装后输出给客户端。 public void serverChat() { // 将接收到的对象值赋给聊天信息的序列化对象 Chat cObj = new Chat(); cObj = (Chat) obj; // chenmin cObj.chatMessage = WordFilter.filter(cObj.chatMessage); chatLog(cObj); // 将聊天信息的序列化对象填加到保存聊天信息的矢量中 userChat.addElement((Chat) cObj); return; } - 22 -
4.3客户端程序编写 4.3.1
程序将通过Register.java用户注册界面收集用户的用户名、密码、年龄、电子邮箱。如图4-7 客户端用户注册信息模块程序: //连接到服务器 Socket toServer; toServer = new Socket(strServerIp,1001); ObjectOutputStream streamToServer=new ObjectOutputStream //写客户详细资料到服务器socket streamToServer.writeObject((Register_Customer)data); (toServer.getOutputStream()); //读来自服务器socket的登陆状态 BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream())); String status=fromServer.readLine(); //显示成功消息 JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+\注册成功\)) { txtUserName.setText(\); pwdUserPassword.setText(\); pwdConfirmPass.setText(\); txtAge.setText(\); txtEmail.setText(\); } 4.3.2 用户登录
4.3.2.1收集用户登录信息
程序将通过Login.java用户登录界面收集用户的用户名、密码,如图
图4-15 收集用户登录信息图
// 接受客户的详细资料 ??????????? - 23 -
try { // 连接到服务器 Socket toServer; toServer = new Socket(strServerIp, 1001); ObjectOutputStream streamToServer = new // 写客户详细资料到服务器socket streamToServer.writeObject((Customer) data); // 读来自服务器socket的登录状态 BufferedReader fromServer = new BufferedReader( new InputStreamReader(toServer.getInputStream())); String status = fromServer.readLine(); if (status.equals(\登录成功\)) { new ChatRoom((String) data.custName, strServerIp); this.dispose(); // 关闭流对象 streamToServer.close(); fromServer.close(); toServer.close(); JOptionPane.showMessageDialog(null, status); streamToServer.close(); fromServer.close(); toServer.close();} ObjectOutputStream(toServer.getOutputStream()); } else {
} // login()结束 4.3.3 聊天室
当用户登录成功后,用户的登录界面将会隐藏,然后创建用户聊天室窗口,在界面的标题栏将会显示当前登录用户的用户名,以防止一个机器上的用户开多个账号进入聊天室后分不清哪个窗口是哪个用户登录的,界面第一行将显示当前在线人数。位于界面正中的两个控件分别是List和TextBox用来显示当前服务器上的在线会员名单列表和公共聊天信息。
位于界面下方的就是一些用于聊天的功能控件和聊天内容个性化配置控件。包括聊天对象,聊天语气,聊天内容,聊天字体,风格,大小,颜色??. 4.3.3.1 用户发送信息
用户需要发送信息时,在聊天内容里写下要发送的信息,然后点击发送就可以发送到其他客户端,也可以选择私聊,聊天表情,聊天信息通过服务器发送到其他客户端。如图:
- 24 -
当多个用户同时在线时可以对某个人私聊,而第三个人的聊天界面会被屏蔽掉。
// \发送\按钮 public void sendMessage() {
Chat chatobj = new Chat(); chatobj.chatUser = strLoginName;
chatobj.chatMessage = txtMessage.getText();
chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem()); chatobj.whisper = chPrivateChat.isSelected() ? true : false; chatobj.emote = emote.getSelectedItem().toString(); // 向服务器发送信息 try {
Socket toServer = new Socket(strServerIp, 1001);
- 25 -