现在需要开发一个基于多个客户端的TCP连接的服务器端程序,完成侦听接收客户端的连接、数据接收、数据向客户端发送的通信程序。请各位大侠给一点具体的建议。谢谢
解决方案 »
- 怎么用delphi模仿 windows text copyer的功能?抓取屏幕上的文字
- dbexpress 做三层出现这样的错误,如何处理
- 请问如何去掉checkbox上面选中后的虚线框?
- 以下这段代码可不可以用一个循环代码?
- 请在家帮帮忙
- 高手请进:帮我把类型为cardinal的信息怎样在可视化的界面上显示出来?!
- 怎样在一个字符串中表达一个目录的上级目录啊? a\b\..是否等于a\啊?
- delphi模拟点击网页上gridview中的一个button按钮
- 我用DELPHI写的最好的推箱子游戏原码!
- 使用ADO开发的程序,无法在WIN98第一版的机子上使用,在线等候.......
- 各位高手,服务service有没有办法晚点启动?
- delphi操作advstringgrid问题,新手。
用户规模,同时在线的数量范围,平时及峰值的数据发送量才能决定采用iocp还是indy甚至自带的socket控件还是api....
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ComCtrls;type
TForm1 = class(TForm)
GSER: TServerSocket;
GClient: TClientSocket;
StatusBar1: TStatusBar;
Label39: TLabel;
AddrList: TListBox;
AddrList2: TListBox;
btn1: TButton;
AddrList3: TListBox;
btn2: TButton;
procedure GSERAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure GSERClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure GClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure GClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.GSERAccept(Sender: TObject; Socket: TCustomWinSocket);
var
AnsiTmp :AnsiString;
begin
StatusBar1.Panels.Items[0].Text := '收到新连接: ' + Socket.RemoteAddress;
Label39.Caption:= '现有 %d 个连接'+ inttostr(GSER.Socket.ActiveConnections) ;
AnsiTmp:=IntToStr(Socket.SocketHandle);
AddrList.Items.Add(Socket.RemoteAddress+'::'+AnsiTmp); //在列表中线上 下位机地址
//GPRS.SocketHandle:=Socket.SocketHandle; //保存当前的新连接的SocketHandle;
AddrList.Items.Add(Socket.RemoteAddress+'::'+AnsiTmp); //在列表中线上 下位机地址end;procedure TForm1.GSERClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
s_ansiTmp :String;
nRecByte :Integer;
ucRecByte :array[0..8191] of Byte;
iTemp :Integer;
RemoteAddress,SocketHandle :string;
begin nRecByte:=Socket.ReceiveLength();
Socket.ReceiveBuf(ucRecByte,nRecByte); RemoteAddress:= Socket.RemoteAddress ;
SocketHandle := IntToStr(Socket.SocketHandle); s_ansiTmp := '从 '+ RemoteAddress + '::' + SocketHandle+
' 接收到数据:xxxxxxxxxxxxxxxxx';
AddrList2.Items.Add( s_ansiTmp );//显示end;procedure TForm1.GClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
StatusBar1.Panels.Items[1].Text:= '成功连接服务器: ' +
Socket.RemoteAddress+'::'+IntToStr(Socket.SocketHandle);
end;procedure TForm1.GClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
AnsiTmp:AnsiString ;
nRecByte :Integer;
ucRecByte :array[0..8191] of Byte;
iTemp :Integer;
begin
nRecByte:=Socket.ReceiveLength(); //接收的数据长度
Socket.ReceiveBuf(ucRecByte,nRecByte); //接收数据
AnsiTmp:='从控制中心收到'+Socket.RemoteAddress+'::'+IntToStr(Socket.SocketHandle);
AnsiTmp := AnsiTmp + ' ';
AnsiTmp := AnsiTmp + Socket.RemoteAddress;
AddrList3.Items.Add(AnsiTmp);//显示end;procedure TForm1.btn1Click(Sender: TObject);
begin
GClient.Host:='127.0.0.1';
GClient.Port:=8888;
GClient.Open();
end;procedure TForm1.FormCreate(Sender: TObject);
begin
GSER.Close();
GSER.Port:=8888; //服务器监听端口
GSER.Active:=true; //打开监听
end;end.