Delphi簡單TCP聊天程式

2021-05-27 07:46:09 字數 4515 閱讀 5270

首先上截圖

最近有點無聊,於是將以前寫到一半的聊天程式拿出來改進了一下。

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...');

trytcpclient.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;

endwriteln(『hello 『 + username);

end;

上面的**向伺服器端傳送cmd_login命令,使用者名稱和密碼,並對伺服器端的回應進行處理

其他用到的函式function tmainform.gettime: string; 獲得當前時間 

這樣乙個簡單的聊天程式就寫好了(目前只限於客戶端與伺服器端通訊)

delphi簡單tcp聊天程式(二):雙向傳輸

:delphi簡單tcp聊天程式(三):登入註冊功能:

Delphi簡單TCP聊天程式(三) 登入註冊功能

對於聊天程式來說,登陸和註冊是很重要的,今天我就來講講登入和註冊功能。第一步當然是新建個資料庫 開啟microsoft access,新建資料庫,儲存為user.mdb,建表user,新建兩個欄位username和password記錄使用者名稱和密碼。然後在伺服器端中放乙個tadoquery和乙個t...

udp與tcp 簡單程式實現聊天

1.用udp進行交流 2.udp資料報模式 寫信的模型 from socket import def main 建立套接字 udp socket socket af inte,sock dgram 傳送方的ip與埠 send addr ip 埠號 繫結埠號 udp socket.bind send ...

TCP多主機聊天程式

多程序實現 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 10 void serverio int fd 11 21 else if s 0 22 26 else 27 32 33 ...