Delphi简单TCP聊天程序

来源:互联网 发布:linux运维工资 编辑:程序博客网 时间:2024/05/22 00:55

首先上截图

最近有点无聊,于是将以前写到一半的聊天程序拿出来改进了一下。

Delphi自带两个控件:TIdTCPServer, tIdTCPClient。顾名思义,一个是服务器端用的,另一个是客户端用的。程序主要思路如下,客户端程序开始运行时与服务器端建立连接,用户登录时向服务器端发送LOGIN命令并发送用户输入的用户名与密码,服务器端处理后返回结果;当用户发送信息时,服务器则充当中继站。

我们先从服务器端开始,用一个Memo输出各种信息,命名为Console,一个输入框edInput记录用户输入,一个IdTCPServer控件,为了方便,写一个过程输出信息

procedure TMainForm.writeln(s: string);begin  console.Lines.Add(s);end;
在FormCreate事件中,打开TCPServer开始监听Const  DefaultPort = 500;procedure TMainForm.FormCreate(Sender: TObject);begin  TCPServer.DefaultPort := defaultPort;  TCPServer.Active := true;  writeln('port: ' + inttoStr(defaultPort));end;
TCPServer有这些事件:OnConnect, OnExecute, OnDisconnect,分别在收到连接请求,收到信息,客户端断开连接时执行。onConnect事件非常简单,我们只在屏幕上打印一句信息并回应客户端
procedure TMainForm.TCPServerConnect(AThread: TIdPeerThread);begin  writeln('Connection request from ' + AThread.Connection.Socket.Binding.PeerIP + ' has been accepted');  AThread.Connection.WriteLn('Welcome to lytalk.');end;

其中AThread.Connection.Socket.Binding.PeerIP为客户端IP。在onExecute事件中,如果是客户端发来的命令,则进行处理,如果是聊天消息,则将它发送到指定客户端上

procedure TMainForm.TCPServerExecute(AThread: TIdPeerThread);var  s: string;  username, pswd: string;begin  s := AThread.Connection.ReadLn();  if s = 'CMD_LOGIN' then//用户登录  begin    username := Athread.Connection.ReadLn();    pswd := Athread.Connection.ReadLn();    Athread.Connection.WriteLn('LOGIN_FAILED');    writeln(username + ' login, IP: ' + Athread.Connection.Socket.Binding.PeerIP);    exit;  end;  if s = 'CMD_REGISTER' then  begin    exit;  end;  writeln(AThread.Connection.Socket.Binding.PeerIP + ' ' + getTime);  writeln(s);end;

简单起见,这里我们只进行简单处理,执行用户的命令,将用户发送的消息显示在屏幕上同样,onDIsconnect也只是在屏幕上打印断开连接的消息

procedure TMainForm.TCPServerDisconnect(AThread: TIdPeerThread);begin  writeln(Athread.Connection.Socket.Binding.PeerIP + ' has disconnected.');end;

这样就完成了一个简单的服务器端接下来是客户端,同样的还是用一个Memo输出各种信息,命名为Console,一个输入框edInput记录用户输入,一个IdTCPClient控件在FormCreate中,我们读取配置文件,建立与服务器的连接,这里用到了iniFiles单元

Var  defaultPort: integer;procedure TMainForm.FormCreate(Sender: TObject);var  configFile: TIniFile;  host: string;begin  configFile := TIniFile.Create(ExtractFilePath(Paramstr(0)) + 'config.ini');  host := configFile.ReadString('server', 'host', '127.0.0.1');  defaultPort := strToInt(configFile.ReadString('server', 'port', '500'));  connect(configFile.ReadString('server', 'host', '127.0.0.1'));end;

上面这几行代码从config.ini文件中读取服务器端IP和端口,并建立连接

// config.ini
[server]host = 192.168.1.11
port = 500

连接服务端的过程
Const  MAX_TIMEOUT = 1000;procedure TMainForm.connect(host: string);begin  writeln('connecting...');  try    TCPClient.Host := host;    TCPClient.Port := defaultPort;    TCPClient.Connect(MAX_TIMEOUT);  except    writeln('Connect failed.');    exit;  end;  writeln('Connect successfully.');  writeln(TCPClient.ReadLn());  connected := true;end;
procedure TMainForm.edInputKeyPress(Sender: TObject; var Key: Char);var  inp: string;begin  if key = #13 then//如果是回车,就开始处理  begin    inp := edInput.Text;    edInput.Text := '';    writeln('you ' + getTime);    writeln(inp);    TCPClient.WriteLn(inp);  end;end;


 登录处理函数 上面的代码设置了TCPClient的host和port,并连接服务器端然后我们要对用户的输入进行处理,将其送到服务器端

procedure TMainForm.login(username, password: string);var  ret: string;begin  TCPClient.WriteLn('CMD_LOGIN');  TCPClient.WriteLn(username);  TCPClient.WriteLn(password);  ret := TCPClient.ReadLn();  if ret = 'LOGIN_FAILED' then  begin    writeln('Login failed.');    exit;  end  writeln(‘Hello ‘ + username);end;


 上面的代码向服务器端发送CMD_LOGIN命令,用户名和密码,并对服务器端的回应进行处理

其他用到的函数function TMainForm.getTime: string; 获得当前时间 

这样一个简单的聊天程序就写好了(目前只限于客户端与服务器端通讯)

源码下载地址:http://u.115.com/file/clnh8akx


Delphi简单TCP聊天程序(二):双向传输http://blog.csdn.net/develorcer/article/details/6696312
Delphi简单TCP聊天程序(三):登录注册功能:http://blog.csdn.net/develorcer/article/details/6714887

原创粉丝点击