首先上截圖
最近有點無聊,於是將以前寫到一半的聊天程式拿出來改進了一下。
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 ...