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
- Delphi简单TCP聊天程序
- Delphi简单TCP聊天程序(二):双向传输
- Delphi简单TCP聊天程序(三):登录注册功能
- Linux TCP实现简单聊天程序
- 一个超级简单的tcp聊天程序
- 利用TCP实现简单聊天程序
- 学习socket(一) TCP简单聊天程序
- Java TCP 简单聊天
- 【TCP简单聊天实现】
- 控制台TCP聊天程序
- tcp简易聊天程序
- 简单模拟qq聊天程序(TCP版)
- 基于TCP/IP的简单的聊天程序
- 一个用Java写的简单的TCP聊天程序
- 基于TCP与UDP的简单聊天程序
- linux下TCP/IP实现简单聊天程序
- linux下TCP/IP实现简单聊天程序
- 一个用Java写的简单的TCP聊天程序
- WCF揭秘——共享数据契约
- STL中的常用的vector,map,set,Sort用法
- 畅通工程hdu1232
- - - 谁把这老贴给翻出来的。。
- Ubuntu 10.04安装NVIDIA官方驱动的方法
- Delphi简单TCP聊天程序
- JFreeChart 解决编码问题
- NIO Buffer
- 据说是11年度最佳代码
- 22个很棒的jQuery文件上传插件
- 隔行模拟摄像头缺点
- 如果你在Windows下用putty来远程连接Linux发现乱码请用下面的方法解决:
- hdu 1690 Bus System--floyd
- shell:select 用法