源代碼下載鏈接:http://download.csdn.net/detail/sky453589103/9514686
我設計的時候是先從服務器端開始設計的,服務器端先給出接口,然後客戶端針對接口編程。
在說服務器的代碼之前先說說數據庫的設計吧。
數據的設計是簡單的,只有兩個表:
create database SimpleChat;
CREATE TABLE IF NOT EXISTS Account (
username varchar(50) NOT NULL,
userpassword varchar(20) NOT NULL,
sex ENUM('male', 'female') NOT NULL,
status ENUM('on', 'off', 'leave', 'busy') NOT NULL,
constraint A_PK primary key(username)
);
CREATE TABLE IF NOT EXISTS Friend(
user_1 varchar(50) NOT NULL,
user_2 varchar(50) NOT NULL,
constraint F_PK primary key (user_1, user_2),
constraint F_FK1 foreign key (user_1) references Account(username),
constraint F_FK2 foreign key (user_2) references Account(username)
);
在源代碼中,服務器端的項目名稱是SimpleChatServer,
服務器端功能模塊包括下面幾個:
1 註冊模塊;
2 登陸模塊;
3 註銷模塊;
4 發送模塊;
5 添加朋友模塊;
6 刪除朋友模塊;
7 獲取朋友列表模塊;
8 輸入檢測模塊;
public ResponseMessage SignUp(String name, String password, Sex sex) {
String sexValue = "";
String statusValue = "off";
if (Sex.MALE == sex) {
sexValue = "male";
} else if (Sex.FEMALE == sex) {
sexValue = "female";
}
ResponseMessage response = new ResponseMessage(0, "Success");
try {
if (username.matches("[; ,]") || password.matches("[; ,]")) {
response.setCode(1);
response.setDescription("username or password has illigal charactor!");
return response;
}
final String sql = "insert into Account values(\'" + name + "\', \'" + password + "\', \'" + sexValue
+ "\', \'" + statusValue + "\');";
Statement statement = conn.createStatement();
statement.executeUpdate(sql);
} catch (SQLException e) {
response.setCode(1);
response.setDescription(e.getMessage());
}
return response;
}
final String sql = "insert into Account values(\'" + name + "\', \'" + password + "\', \'" + sexValue
+ "\', \'" + statusValue + "\');";
Statement statement = conn.createStatement();
statement.executeUpdate(sql);
public void AddUser(String name, Socket s) {
userBuf.put(name, s);
}
public void RemoveUser(String name) {
userBuf.remove(name);
}
其實這兩個函數只是吧userBuf中的響應的鍵值對給刪除了。不會訪問數據庫。寫這兩個方法的原因是爲了以後如果要改變userBuf的表現形式,可以不用改變客戶端的代碼。