我在搞一个基于c/s模式的通讯软件,一个服务器,用serversocket,其他的客户端基于clientsocket,客户均之间的通讯均是通过服务器转发的,怎么实现服务器把一个客户向另一个客户的信息转发!
最好有源代码!谢谢!急!
解决方案 »
- delphi如何使用正则表达式提取链接的文字?
- 怎么把B5纸横向打印啊
- 关于数据库动态连接测试的问题
- 关于dbgrideh 和用printgrideh打印的问题
- 大家好!请问TToolBar里面ToolBotton的图标就不可以大一点吗?现在只可以16X16的。
- 请大家给个意见!
- delphi在那里有市场?请各位老兄指导!
- 请问,DELPHI6中的:Diagram 作什么用的?
- 如果需要把一些数据存入文件用什么办法好????
- 如何用modem直接向call机发数字信息?
- 再来一个问题,刚才的问题问错了,真夸张!~~~~~进来看!~
- Ehgrid如何添加计算列,如我想第一列为1 2 3 4 5 ....序号如何做?
小弟初学,望高手多多指点
Server会维护一个数组:Conections[];表示有效的连接。可是。我怎么知道Conections[0]具体是哪个IP 呢?由于CLIENT 的上线,下线,这个Conections[0]所对应的IP是不是也是变的呢?那么是不是要自己手动建立一个列表来维护呢?也就是说自己维护一个IP列表。以便可以找到 Conections[]数组与当前所有连接的IP对应表呢?如何维护这两个表的对应关系才合理呢?
服务器和客户端在一起
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, Menus, ToolWin, ComCtrls, ExtCtrls, StdCtrls, ScktComp;type
Tw_cww = class(TForm)
ImageList: TImageList;
MainMenu1: TMainMenu;
listen11: TMenuItem;
AboutSystem11: TMenuItem;
Listen1: TMenuItem;
Connect1: TMenuItem;
Disconnect1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
ToolBar1: TToolBar;
StatusBar1: TStatusBar;
Panel1: TPanel;
Memo1: TMemo;
Splitter1: TSplitter;
Memo2: TMemo;
Splitter2: TSplitter;
Panel2: TPanel;
Panel3: TPanel;
Memo3: TMemo;
ClientSocket: TClientSocket;
ServerSocket: TServerSocket;
Timer1: TTimer;
ToolButton_listen: TToolButton;
ToolButton_connect: TToolButton;
ToolButton_disconnect: TToolButton;
ToolButton_aboutsystem: TToolButton;
ToolButton_exit: TToolButton;
ToolButton6: TToolButton;
procedure ToolButton_listenClick(Sender: TObject);
procedure ToolButton_connectClick(Sender: TObject);
procedure ToolButton_disconnectClick(Sender: TObject);
procedure ToolButton_aboutsystemClick(Sender: TObject);
procedure ToolButton_exitClick(Sender: TObject);
procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
procedure Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
isserver:boolean;
server:string;
membername:string;
procedure refresh_memo3;
public
{ Public declarations }
end;var
w_cww: Tw_cww;implementationuses Unit2;{$R *.dfm}procedure tw_cww.refresh_memo3;
var
i:integer;
begin
w_cww.Memo3.Lines.Clear;
w_cww.Memo3.Lines.Add(membername+'['+w_cww.ServerSocket.Socket.LocalHost+'](主席)');for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
begin
w_cww.Memo3.Lines.Add(w_cww.ServerSocket.Socket.Connections[i].RemoteHost+'(成员)');end;
end;procedure Tw_cww.ToolButton_listenClick(Sender: TObject);
beginif isserver then
begin
w_cww.listen11.Enabled:=true;
w_cww.ToolButton_listen.Enabled:=true;w_cww.listen11.Checked:=true;
w_cww.ToolButton_listen.Down:=true;
w_cww.ToolButton_connect.Enabled:=false;
w_cww.ToolButton_disconnect.Enabled:=false;w_cww.Connect1.Enabled:=false;
w_cww.Disconnect1.Enabled:=false;end
else
begin
w_cww.listen11.Enabled:=false;
w_cww.ToolButton_listen.Enabled:=false;w_cww.ToolButton_connect.Enabled:=true;
w_cww.ToolButton_disconnect.Enabled:=true;w_cww.Connect1.Enabled:=true;
w_cww.Disconnect1.Enabled:=true;end;if w_cww.listen11.Checked then
begin
showmessage('lasjfdal');
w_cww.ClientSocket.Active:=false;
w_cww.ServerSocket.Active:=true;
w_cww.StatusBar1.Panels[2].Text:='本机是服务器正在监听....';
end
else
begin
if w_cww.ServerSocket.Active then
w_cww.ServerSocket.Active:=false;
w_cww.StatusBar1.Panels[2].Text:='本机是客户进程';
end;end;procedure Tw_cww.ToolButton_connectClick(Sender: TObject);
beginif(sender is TMenuItem) then
begin
w_cww.Connect1.Checked:=not w_cww.Connect1.Checked;
w_cww.ToolButton_connect.Down:=w_cww.Connect1.Checked;
end
else
beginw_cww.Connect1.Checked:=w_cww.ToolButton_connect.Down;
if w_cww.Connect1.Checked then
begin
if w_cww.ClientSocket.Active then
w_cww.ClientSocket.Active:=false;with w_cww.ClientSocket do
begin
//host:=server;
w_cww.ClientSocket.Port:=462110;
w_cww.ClientSocket.Address:='172.16.92.200';
try active:=true;
w_cww.StatusBar1.Panels[2].Text:='本机是客户进程,连接成功';
except
showmessage('连接失败');
end;
end;
end;
end;
end;procedure Tw_cww.ToolButton_disconnectClick(Sender: TObject);
beginif (sender is TMenuItem) then
begin
w_cww.Disconnect1.Checked:=not w_cww.Disconnect1.Checked;
w_cww.ToolButton_disconnect.Down:=w_cww.Disconnect1.Checked;
end
else
begin
w_cww.Disconnect1.Checked:=w_cww.ToolButton_disconnect.Down;if w_cww.Disconnect1.Checked then
begin
try w_cww.ClientSocket.Active:=false;
w_cww.StatusBar1.Panels[2].Text:='断开连接';except
showmessage('断开连接失败!');end;end;end; end;procedure Tw_cww.ToolButton_aboutsystemClick(Sender: TObject);
begin
aboutbox.ShowModal;
end;procedure Tw_cww.ToolButton_exitClick(Sender: TObject);
begin
w_cww.ClientSocket.Active:=false;
w_cww.ServerSocket.Active:=false;
close;
end;procedure Tw_cww.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
oldcolor:Tcolor;
oldstyle:Tbrushstyle; begin
if panel.Index=3 then
begin
with w_cww.StatusBar1.Canvas do begin
oldcolor:=font.Color;
oldstyle:=brush.Style;
brush.Style:=bsclear;
font.Color:=clyellow;
font.Name:='隶书';
font.Height:=20;
w_cww.ImageList.draw(w_cww.StatusBar1.Canvas,Rect.left+5,Rect.top+1,8); font.Color:=clblue;
TextOut(Rect.Left+40,Rect.Top+5,panel.Text); font.Color:=clyellow;
textout(rect.Left+42,rect.Top+7,panel.Text); font.Color:=oldcolor;
brush.Style:=oldstyle; end;
end;end;procedure Tw_cww.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i:integer;
begin if key=vk_return then
begin if isserver then
begin
for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
begin //w_cww.ServerSocket.Socket.Connections[i].SendText('讨论'+w_cww.Memo1.Lines[w_cww.Memo1.Lines.Count-1]+'['+membername+']'+w_cww.Memo1.Lines.Text); w_cww.ServerSocket.Socket.Connections[i].SendText('讨论'+'['+membername+']'+w_cww.Memo1.Lines.Text); end; end
else
showmessage('client');
// w_cww.ClientSocket.Socket.SendText('讨论'+w_cww.Memo1.Lines[w_cww.Memo1.Lines.Count-1]+'['+membername+']');
w_cww.ClientSocket.Socket.SendText('讨论'+'['+membername+']'+w_cww.Memo1.Lines.Text);
end;end;procedure Tw_cww.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
refresh_memo3;
end;procedure Tw_cww.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
refresh_memo3;
end;procedure Tw_cww.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ss1,ss2:string;
ll,i :integer;
begin
ss1:=socket.ReceiveText;
ll:=length(ss1);
ss2:=copy(ss1,7,ll-6);
//w_cww.Memo2.Lines.Add(ss2);
w_cww.Memo2.Lines.Add(ss2); for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do begin
// if (w_cww.ServerSocket.Socket.Connections[i]<>socket) then
//w_cww.ServerSocket.Socket.Connections[i].SendText('[讨论]'+ss2);
w_cww.ServerSocket.Socket.Connections[i].SendText('[讨论]'+ss1);
end; w_cww.Memo3.Lines.Add(ss1);//jiadeend;
Socket: TCustomWinSocket);
beginw_cww.StatusBar1.Panels[2].Text:='本机是客户进程,已经连接到:'+socket.RemoteHost;
end;procedure Tw_cww.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
w_cww.Memo1.Clear;
w_cww.Memo2.Clear;
w_cww.Memo3.Clear;
end;procedure Tw_cww.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showmessage('服务器连接失败');
errorcode:=0;
end;procedure Tw_cww.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
cmd,ss1,ss2,ss3,ss4:string;
ll,i,k:integer; begin ss1:=socket.ReceiveText;
ll:=length(ss1);
cmd:=copy(ss1,2,4);
ss2:=copy(ss1,7,ll-6);
if cmd='讨论' then
begin
w_cww.Memo2.Lines.Add(ss2);
end
else if(cmd='刷新') then
begin
w_cww.Memo3.Lines.Clear;
end
else
begin k:=Pos('[信息]',ss2);
while k>0 do
begin
ss3:=copy(ss2,1,k-1);
ss2:=copy(ss2,k+6,length(ss2)-k-5);
w_cww.Memo3.Lines.Add(ss3);
k:=Pos('[信息]',ss2);
end;
//w_cww.Memo3.Lines.Add(ss2);
w_cww.Memo3.Lines.Add(ss1);
end;
end;procedure Tw_cww.Timer1Timer(Sender: TObject);
var
i,k :integer;beginif isserver then
refresh_memo3;for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
w_cww.ServerSocket.Socket.Connections[i].SendText('[刷新]开始');for k:=1 to w_cww.Memo3.Lines.Count-1 do
for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
//w_cww.ServerSocket.Socket.Connections[i].SendText('[信息]'+w_cww.Memo3.Lines[k-1]);
w_cww.ServerSocket.Socket.Connections[i].SendText('[信息]'+w_cww.Memo3.Lines.Text);end;procedure Tw_cww.FormCreate(Sender: TObject);
{var
ss:integer;
p1,p2:string;
}
begin {ss:=paramcount;
if ss<3 then
begin
application.Terminate;
end
else
begin
p1:=lowercase(paramstr(1));
p2:=paramstr(2);
membername:=paramstr(3);
if p1='server' then
begin
isserver:=true;
end
else
begin
isserver:=false;
end;
server:=p2;
end; w_cww.Caption:='['+membername+']';
// isserver:=true;
w_cww.listen11.OnClick(nil); }
isserver:=false;
membername:='taotao111';
server:='192.16.92.200';//服务器ipend;end.procedure Tw_cww.ToolButton_exitClick(Sender: TObject);
begin
w_cww.ClientSocket.Active:=false;
w_cww.ServerSocket.Active:=false;
close;
end;procedure Tw_cww.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
var
oldcolor:Tcolor;
oldstyle:Tbrushstyle; begin
if panel.Index=3 then
begin
with w_cww.StatusBar1.Canvas do begin
oldcolor:=font.Color;
oldstyle:=brush.Style;
brush.Style:=bsclear;
font.Color:=clyellow;
font.Name:='隶书';
font.Height:=20;
w_cww.ImageList.draw(w_cww.StatusBar1.Canvas,Rect.left+5,Rect.top+1,8); font.Color:=clblue;
TextOut(Rect.Left+40,Rect.Top+5,panel.Text); font.Color:=clyellow;
textout(rect.Left+42,rect.Top+7,panel.Text); font.Color:=oldcolor;
brush.Style:=oldstyle; end;
end;end;procedure Tw_cww.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
i:integer;
begin if key=vk_return then
begin if isserver then
begin
for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
begin //w_cww.ServerSocket.Socket.Connections[i].SendText('讨论'+w_cww.Memo1.Lines[w_cww.Memo1.Lines.Count-1]+'['+membername+']'+w_cww.Memo1.Lines.Text); w_cww.ServerSocket.Socket.Connections[i].SendText('讨论'+'['+membername+']'+w_cww.Memo1.Lines.Text); end; end
else
showmessage('client');
// w_cww.ClientSocket.Socket.SendText('讨论'+w_cww.Memo1.Lines[w_cww.Memo1.Lines.Count-1]+'['+membername+']');
w_cww.ClientSocket.Socket.SendText('讨论'+'['+membername+']'+w_cww.Memo1.Lines.Text);
end;end;procedure Tw_cww.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
begin
refresh_memo3;
end;procedure Tw_cww.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
refresh_memo3;
end;procedure Tw_cww.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ss1,ss2:string;
ll,i :integer;
begin
ss1:=socket.ReceiveText;
ll:=length(ss1);
ss2:=copy(ss1,7,ll-6);
//w_cww.Memo2.Lines.Add(ss2);
w_cww.Memo2.Lines.Add(ss2); for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do begin
// if (w_cww.ServerSocket.Socket.Connections[i]<>socket) then
//w_cww.ServerSocket.Socket.Connections[i].SendText('[讨论]'+ss2);
w_cww.ServerSocket.Socket.Connections[i].SendText('[讨论]'+ss1);
end; w_cww.Memo3.Lines.Add(ss1);//jiadeend;procedure Tw_cww.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
beginw_cww.StatusBar1.Panels[2].Text:='本机是客户进程,已经连接到:'+socket.RemoteHost;
end;procedure Tw_cww.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
w_cww.Memo1.Clear;
w_cww.Memo2.Clear;
w_cww.Memo3.Clear;
end;procedure Tw_cww.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showmessage('服务器连接失败');
errorcode:=0;
end;procedure Tw_cww.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
cmd,ss1,ss2,ss3,ss4:string;
ll,i,k:integer; begin ss1:=socket.ReceiveText;
ll:=length(ss1);
cmd:=copy(ss1,2,4);
ss2:=copy(ss1,7,ll-6);
if cmd='讨论' then
begin
w_cww.Memo2.Lines.Add(ss2);
end
else if(cmd='刷新') then
begin
w_cww.Memo3.Lines.Clear;
end
else
begin k:=Pos('[信息]',ss2);
while k>0 do
begin
ss3:=copy(ss2,1,k-1);
ss2:=copy(ss2,k+6,length(ss2)-k-5);
w_cww.Memo3.Lines.Add(ss3);
k:=Pos('[信息]',ss2);
end;
//w_cww.Memo3.Lines.Add(ss2);
w_cww.Memo3.Lines.Add(ss1);
end;
end;procedure Tw_cww.Timer1Timer(Sender: TObject);
var
i,k :integer;beginif isserver then
refresh_memo3;for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
w_cww.ServerSocket.Socket.Connections[i].SendText('[刷新]开始');for k:=1 to w_cww.Memo3.Lines.Count-1 do
for i:=0 to w_cww.ServerSocket.Socket.ActiveConnections-1 do
//w_cww.ServerSocket.Socket.Connections[i].SendText('[信息]'+w_cww.Memo3.Lines[k-1]);
w_cww.ServerSocket.Socket.Connections[i].SendText('[信息]'+w_cww.Memo3.Lines.Text);end;procedure Tw_cww.FormCreate(Sender: TObject);
{var
ss:integer;
p1,p2:string;
}
begin {ss:=paramcount;
if ss<3 then
begin
application.Terminate;
end
else
begin
p1:=lowercase(paramstr(1));
p2:=paramstr(2);
membername:=paramstr(3);
if p1='server' then
begin
isserver:=true;
end
else
begin
isserver:=false;
end;
server:=p2;
end; w_cww.Caption:='['+membername+']';
// isserver:=true;
w_cww.listen11.OnClick(nil); }
isserver:=false;
membername:='taotao111';
server:='192.16.92.200';//服务器ipend;end.