给你个完整的,基于ServerSocket与ClientSocket 的通信程序 Client端:unit UnitMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls, Menus;type TForm1 = class(TForm) MemoChat: TMemo; EditSay: TEdit; ButtonSend: TButton; ButtonConnect: TButton; ClientSocket: TClientSocket; StatusBar: TStatusBar; Bevel1: TBevel; EditIP: TLabeledEdit; EditPort: TLabeledEdit; Label1: TLabel; EditNick: TLabeledEdit; ButtonChangeNick: TButton; MainMenu: TMainMenu; File1: TMenuItem; ConnectDisconnect1: TMenuItem; ChangeNickname1: TMenuItem; Exit1: TMenuItem; Bevel2: TBevel; procedure ButtonConnectClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure ButtonSendClick(Sender: TObject); procedure EditChatKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure Exit1Click(Sender: TObject); procedure ConnectDisconnect1Click(Sender: TObject); procedure ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ChangeNickname1Click(Sender: TObject); procedure EditNickKeyPress(Sender: TObject; var Key: Char); procedure EditSayKeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonConnectClick(Sender: TObject); begin ClientSocket.Host := EditIp.Text; ClientSocket.Port := StrToInt(EditPort.Text); ClientSocket.Active := True; end;procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); var read : string; begin read := socket.ReceiveText; memoChat.Lines.Add(read); end;procedure TForm1.ButtonSendClick(Sender: TObject); begin ClientSocket.Socket.SendText(EditNick.Text + ' says: ' + EditSay.Text); EditSay.Text := ''; end; procedure TForm1.EditChatKeyPress(Sender: TObject; var Key: Char); begin Key := #0; //i dont want to change the nickname at runtime end;procedure TForm1.FormCreate(Sender: TObject); begin MemoChat.Clear; StatusBar.SimpleText := 'Status: Ready [Not connected].'; EditNick.Text := 'Unnamed Soldier'; end;procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar.SimpleText := 'Status: Connected with '+ClientSocket.Socket.RemoteHost; end;procedure TForm1.Exit1Click(Sender: TObject); begin Close; end;procedure TForm1.ConnectDisconnect1Click(Sender: TObject); begin ClientSocket.Active := not ClientSocket.Active; end;procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar.SimpleText := 'Status: Disconnected.'; end;procedure TForm1.ChangeNickname1Click(Sender: TObject); var old, new : string; begin InputQuery('New nick?', 'Please write the new nickname you want to use.', new); if new = '' then Exit; old := EditNick.Text; ClientSocket.Socket.SendText(old + ' just changed its nick to '+ new); EditNick.Text := New; end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char); begin Key := #0; end; procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char); begin if key = #13 then //#13 is Enter begin ButtonSend.Click; end; end;end.
Server端: unit UnitMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, Menus, ComCtrls, ExtCtrls;type TForm1 = class(TForm) MemoChat: TMemo; ServerSocket: TServerSocket; EditSay: TEdit; Label1: TLabel; MainMenu1: TMainMenu; N1: TMenuItem; Listen: TMenuItem; Exit1: TMenuItem; ButtonSend: TButton; StatusBar: TStatusBar; ChangeNickname1: TMenuItem; EditNick: TLabeledEdit; Button1: TButton; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure ListenClick(Sender: TObject); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure Exit1Click(Sender: TObject); function SendToAllClients( s : string) : boolean; procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ButtonSendClick(Sender: TObject); procedure EditNickKeyPress(Sender: TObject; var Key: Char); procedure ChangeNickname1Click(Sender: TObject); procedure EditSayKeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function TForm1.SendToAllClients( s : string) : boolean; var i : integer; begin if ServerSocket.Socket.ActiveConnections = 0 then begin ShowMessage('There are no connected clients.'); Exit; end; for i := 0 to (ServerSocket.Socket.ActiveConnections - 1) do begin ServerSocket.Socket.Connections[i].SendText(s); end; end;procedure TForm1.FormCreate(Sender: TObject); begin MemoChat.Clear; EditNick.Text := 'Unnamed Soldier'; end;procedure TForm1.ListenClick(Sender: TObject); var StrPort : string; IntPort : Integer; begin if not Listen.Checked then begin InputQuery('What port?', 'Please enter the port you want to listen. Make sure it''s a valid integer number between 1 and 65535.', StrPort); If StrPort = '' then Exit; if length(StrPort) > 6 then Exit; try IntPort := StrToInt(StrPort); except begin MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError); Exit; end; end; if (IntPort < 0) or (IntPort > 65535) then begin MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError); Exit; end; Listen.Checked := True; ServerSocket.Port := IntPort; ServerSocket.Active := True; StatusBar.SimpleText := 'Status: Listening on port '+StrPort; end else begin //if i am alredy connected Listen.Checked := False; ServerSocket.Active := False; StatusBar.SimpleText := 'Status: Ready [not listening].'; end;end;procedure TForm1.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin SendToAllClients('<'+Socket.RemoteHost+' just connected.>'); MemoChat.Lines.Add('<'+Socket.RemoteHost+' just connected.>'); end; procedure TForm1.Exit1Click(Sender: TObject); begin Close; end;procedure TForm1.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var received : string; begin received := Socket.ReceiveText; SendToAllClients(received); MemoChat.Lines.Add(received); end;procedure TForm1.ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin SendToAllClients('<'+Socket.RemoteHost+' just disconnected.>'); MemoChat.Lines.Add('<'+Socket.RemoteHost+' just disconnected.>'); end;procedure TForm1.ButtonSendClick(Sender: TObject); begin SendToAllClients(EditNick.Text + ' [Server] says: ' + EditSay.Text); MemoChat.Lines.Add(EditNick.Text +' [Server] says: ' + EditSay.Text); EditSay.Text := ''; end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char); begin Key := #0; //because i dont want nobody to change its nickname until they press the change button end;procedure TForm1.ChangeNickname1Click(Sender: TObject); var old, new : string; begin InputQuery('New nick?', 'Please write the new nickname you want to use.', new); if new = '' then Exit; old := EditNick.Text; SendToAllClients('<'+Old + ' has just changed its nick to '+ new+'.>'); MemoChat.Lines.Add('<'+Old + ' has just changed its nick to '+ new+'.>'); EditNick.Text := New; end; procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then //#13 is Enter begin ButtonSend.Click; end; end;end.
Client端:unit UnitMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls, Menus;type
TForm1 = class(TForm)
MemoChat: TMemo;
EditSay: TEdit;
ButtonSend: TButton;
ButtonConnect: TButton;
ClientSocket: TClientSocket;
StatusBar: TStatusBar;
Bevel1: TBevel;
EditIP: TLabeledEdit;
EditPort: TLabeledEdit;
Label1: TLabel;
EditNick: TLabeledEdit;
ButtonChangeNick: TButton;
MainMenu: TMainMenu;
File1: TMenuItem;
ConnectDisconnect1: TMenuItem;
ChangeNickname1: TMenuItem;
Exit1: TMenuItem;
Bevel2: TBevel;
procedure ButtonConnectClick(Sender: TObject);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ButtonSendClick(Sender: TObject);
procedure EditChatKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Exit1Click(Sender: TObject);
procedure ConnectDisconnect1Click(Sender: TObject);
procedure ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ChangeNickname1Click(Sender: TObject);
procedure EditNickKeyPress(Sender: TObject; var Key: Char);
procedure EditSayKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ButtonConnectClick(Sender: TObject);
begin
ClientSocket.Host := EditIp.Text;
ClientSocket.Port := StrToInt(EditPort.Text);
ClientSocket.Active := True;
end;procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
read : string;
begin
read := socket.ReceiveText;
memoChat.Lines.Add(read);
end;procedure TForm1.ButtonSendClick(Sender: TObject);
begin
ClientSocket.Socket.SendText(EditNick.Text + ' says: ' + EditSay.Text);
EditSay.Text := '';
end;
procedure TForm1.EditChatKeyPress(Sender: TObject; var Key: Char);
begin
Key := #0; //i dont want to change the nickname at runtime
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MemoChat.Clear;
StatusBar.SimpleText := 'Status: Ready [Not connected].';
EditNick.Text := 'Unnamed Soldier';
end;procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar.SimpleText := 'Status: Connected with '+ClientSocket.Socket.RemoteHost;
end;procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;procedure TForm1.ConnectDisconnect1Click(Sender: TObject);
begin
ClientSocket.Active := not ClientSocket.Active;
end;procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar.SimpleText := 'Status: Disconnected.';
end;procedure TForm1.ChangeNickname1Click(Sender: TObject);
var
old, new : string;
begin
InputQuery('New nick?', 'Please write the new nickname you want to use.', new);
if new = '' then
Exit;
old := EditNick.Text;
ClientSocket.Socket.SendText(old + ' just changed its nick to '+ new);
EditNick.Text := New;
end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char);
begin
Key := #0;
end;
procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then //#13 is Enter
begin
ButtonSend.Click;
end;
end;end.
unit UnitMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, Menus, ComCtrls, ExtCtrls;type
TForm1 = class(TForm)
MemoChat: TMemo;
ServerSocket: TServerSocket;
EditSay: TEdit;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
Listen: TMenuItem;
Exit1: TMenuItem;
ButtonSend: TButton;
StatusBar: TStatusBar;
ChangeNickname1: TMenuItem;
EditNick: TLabeledEdit;
Button1: TButton;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure ListenClick(Sender: TObject);
procedure ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Exit1Click(Sender: TObject);
function SendToAllClients( s : string) : boolean;
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ButtonSendClick(Sender: TObject);
procedure EditNickKeyPress(Sender: TObject; var Key: Char);
procedure ChangeNickname1Click(Sender: TObject);
procedure EditSayKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function TForm1.SendToAllClients( s : string) : boolean;
var
i : integer;
begin
if ServerSocket.Socket.ActiveConnections = 0 then
begin
ShowMessage('There are no connected clients.');
Exit;
end;
for i := 0 to (ServerSocket.Socket.ActiveConnections - 1) do
begin
ServerSocket.Socket.Connections[i].SendText(s);
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MemoChat.Clear;
EditNick.Text := 'Unnamed Soldier';
end;procedure TForm1.ListenClick(Sender: TObject);
var
StrPort : string;
IntPort : Integer;
begin
if not Listen.Checked then
begin
InputQuery('What port?', 'Please enter the port you want to listen. Make sure it''s a valid integer number between 1 and 65535.', StrPort);
If StrPort = '' then Exit;
if length(StrPort) > 6 then Exit;
try
IntPort := StrToInt(StrPort);
except
begin
MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError);
Exit;
end;
end;
if (IntPort < 0) or (IntPort > 65535) then
begin
MessageBox(handle, 'Stupid you. What did I just tell you? You didn''t give me a valid port!!!', 'Duh!', Mb_ok + Mb_IconError);
Exit;
end;
Listen.Checked := True;
ServerSocket.Port := IntPort;
ServerSocket.Active := True;
StatusBar.SimpleText := 'Status: Listening on port '+StrPort;
end
else
begin //if i am alredy connected
Listen.Checked := False;
ServerSocket.Active := False;
StatusBar.SimpleText := 'Status: Ready [not listening].';
end;end;procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
SendToAllClients('<'+Socket.RemoteHost+' just connected.>');
MemoChat.Lines.Add('<'+Socket.RemoteHost+' just connected.>');
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
received : string;
begin
received := Socket.ReceiveText;
SendToAllClients(received);
MemoChat.Lines.Add(received);
end;procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
SendToAllClients('<'+Socket.RemoteHost+' just disconnected.>');
MemoChat.Lines.Add('<'+Socket.RemoteHost+' just disconnected.>');
end;procedure TForm1.ButtonSendClick(Sender: TObject);
begin
SendToAllClients(EditNick.Text + ' [Server] says: ' + EditSay.Text);
MemoChat.Lines.Add(EditNick.Text +' [Server] says: ' + EditSay.Text);
EditSay.Text := '';
end;procedure TForm1.EditNickKeyPress(Sender: TObject; var Key: Char);
begin
Key := #0; //because i dont want nobody to change its nickname until they press the change button
end;procedure TForm1.ChangeNickname1Click(Sender: TObject);
var
old, new : string;
begin
InputQuery('New nick?', 'Please write the new nickname you want to use.', new);
if new = '' then
Exit;
old := EditNick.Text;
SendToAllClients('<'+Old + ' has just changed its nick to '+ new+'.>');
MemoChat.Lines.Add('<'+Old + ' has just changed its nick to '+ new+'.>');
EditNick.Text := New;
end;
procedure TForm1.EditSayKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then //#13 is Enter
begin
ButtonSend.Click;
end;
end;end.