您的位置:首页 > 理论基础 > 计算机网络

Delphi简单TCP聊天程序(三):登录注册功能

2011-08-24 14:58 357 查看
对于聊天程序来说,登陆和注册是很重要的,今天我就来讲讲登录和注册功能。
第一步当然是新建个数据库 。打开Microsoft Access,新建数据库,保存为user.mdb,建表user,新建两个字段Username和Password记录用户名和密码。然后在服务器端中放一个TADOQuery和一个TADOConnection。在FormCreate中连接数据库

const
dbName = 'user.mdb';
begin
....
try
ADOConnection.Close;
ADOConnection.ConnectionString := 'Provider=Microsoft.JET.OLEDB.4.0;'
+ 'Data Source=' + ExtractFilePath(Paramstr(0)) + dbName
+ ';Persist Security Info=False';
ADOConnection.Open();
except
end;
end;
客户端在登录时会向服务器端发送CMD_LOGIN命令,所以我们在ServerExecute进行处理
{SQLSearch
----------
功能:查找数据库
参数:
sqlText: SQL语句
sqlConnection:SQL连接
返回值:如果查找到了为真}
function SQLSearch(sqlText: string; sqlConnection: TADOConnection): boolean;
var
ADOQuery: TADOQuery;
begin
ADOQuery := TADOQuery.Create(nil);
ADOQuery.Connection := sqlConnection;
with ADOQuery do
begin
close;
SQL.Clear;
SQL.Add(sqlText);
Open;
result := not ADOQuery.IsEmpty;
end;
end;

{checkUser
功能:检查用户名密码是否正确
参数:
username:用户名
password:密码
返回值:是否正确}
function TMainForm.checkUser(username, password: string): boolean;
var
str: string;
begin
str := 'Select * From [user] where username=' + quotedStr(username) +
'and password=' + quotedStr(password);
result := SQLSearch(str, ADOConnection);
end;

procedure TMainForm.TCPServerExecute(AContext: TIdContext);
var
s: string;
username, password: string;
begin
s := AContext.Connection.socket.ReadLn();
if s = 'CMD_LOGIN' then
begin
username := AContext.Connection.socket.ReadLn();	//读取用户名,密码
password := AContext.Connection.socket.ReadLn();
if checkUser(username, password) then //检查是否正确并回应客户端
begin
AContext.Connection.socket.WriteLn('LOGIN_SUCCESSFULLY');
end
else
begin
AContext.Connection.socket.WriteLn('LOGIN_FAILED');
end;
exit;
end;
.....
end;
同样的,注册也可以很简单的实现
procedure TMainForm.TCPServerExecute(AContext: TIdContext);
var
s: string;
username, password: string;
begin
...
if s = 'CMD_REGISTER' then
begin
username := AContext.Connection.socket.ReadLn();   //读取用户名,密码
password := AContext.Connection.socket.ReadLn();
if SQLSearch('Select * From [user] where username=' + quotedStr(username), ADOConnection) then
begin
AContext.Connection.Socket.WriteLn('REGISTER_FAILED'); //假如用户名已被注册,发送REGISTER_FAILED
AContext.Connection.Socket.WriteLn('Username is already registered.');
exit;
end;
ADOQuery.Connection := ADOConnection;
with ADOQuery do
begin
close;
SQL.Clear;
SQL.Add('Insert into [user]([Username], [Password]) values(''' + username +
''', ''' + password + ''')');
ExecSQL;
end;
AContext.Connection.socket.WriteLn('REGISTER_SUCCESSFULLY');
exit;
end;
...
end;
修改一下客户端的代码
function login(username, password: string): boolean;
var
ret: string;
begin
suspendThread(listenThread);
log('Username: '+ username);
TCPClient.Socket.WriteLn('CMD_LOGIN');  //发送CMD_LOGIN命令,用户名,密码
TCPClient.Socket.WriteLn(username);
TCPClient.Socket.WriteLn(password);
ret := TCPClient.Socket.ReadLn();  //接受服务器端回应
if ret = 'LOGIN_FAILED' then  //登陆失败
begin
log('Login failed.');
ResumeThread(listenThread);
result := false;
exit;
end;
ResumeThread(listenThread);
result := true;
end;

procedure reg(username, password: string);
var
ret: string;
begin
suspendThread(listenThread);
log('Username: '+ username);
TCPClient.Socket.WriteLn('CMD_REGISTER'); //发送CMD_LOGIN命令,用户名,密码
TCPClient.Socket.WriteLn(username);
TCPClient.Socket.WriteLn(password);
ret := TCPClient.Socket.ReadLn();
if ret = 'REGISTER_FAILED' then  //注册失败
begin
ret := TCPClient.Socket.ReadLn();
log('Register failed, Error msg: ' + ret);
showMessage('Register failed, Error msg: ' + ret);
ResumeThread(listenThread);
exit;
end;
log('Register successfully, ' + username);
ResumeThread(listenThread);
end;
在登录注册时我将ListenThread暂时挂起,目的是为了让处理函数能接收到服务器端的回应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: