请教delphi7.0中的TcpServer的onAccept事件的用法,多谢指点!分数不够再加!

cxfirefox 2004-04-16 11:42:30
请问delphi7.0中的tcpServer的onaccept事件什么时候触发,我下面的这个程序,发送了两次数据,但是只触发了一次,为什么啊?
procedure TForm1.Button1Click(Sender: TObject);
var Temp:Tbitmap;
TempJpg:TJpegimage;
imgSize,s:String;
begin
if OpenPictureDialog1.Execute then
begin
Temp:=TBitmap.Create;
TempJpg:=TJpegimage.Create;
try
Temp.LoadFromFile(OpenpictureDialog1.FileName);
Tempjpg.Assign(Temp);
Tempjpg.CompressionQuality:=10; //压缩率
Tempjpg.SaveToStream(imgStreamSent);
finally
Temp.Free;
end;
end;
TcpClient1.RemoteHost:=edtRemoteHost.Text;
TcpClient1.RemotePort:=edtRemotePort.Text;
if edtRemotePort.Text <>edtLocalport.Text then
showmessage('端口不匹配');
if TcpClient1.Connect then
begin

//Tempjpg.Free;
imgStreamSent.Position:=0;
imgSize:=intToStr(imgStreamSent.Size);
TcpClient1.Sendln(imgSize); //第一次发送
//等待通知传送
s:=TcpClient1.Receiveln;
while not (s = 'Ready for Image' ) do
s:=TcpClient1.Receiveln;

TcpClient1.Sendln('haha'); //第二次发送

//imgStreamSent.Position:=0;
//TcpClient1.SendStream(imgStreamSent);
//TcpClient1.Disconnect;

end;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var Tempimg:TBitmap;
Tempjpg:TJpegimage;
s:String;
OneFrameSize:Integer;
RevBuffer:array[1..1024] of byte;
begin
//accept事件是什么触发的?
s:=ClientSocket.Receiveln;
if Revimg=false then
begin

RevSize:=StrToInt(s);
while (RevSize=0) do
RevSize:=StrToInt(ClientSocket.Receiveln);
Revimg:=true;
ClientSocket.Sendln('Ready for Image');
end else
begin
……
Revimg:=false;
end;
end;
...全文
70 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinmaofan 2004-05-03
  • 打赏
  • 举报
回复
up
cxfirefox 2004-04-18
  • 打赏
  • 举报
回复
怎么没有人回答啊,请大家帮帮忙吧!
环境:Windows XP SP 3、 VC++ 6.0、 Windows Server 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0 IDE打开.dws文件 2、点击“!”按钮运行程序 3、如果一切正常会出现一个对话框,然后选择下拉框的“服务端”启动服务器进程--接着点击“监听”按钮 4、然后再点击“!”按钮运行客户端进程 5、如果一切正常,那么选择下拉框的“客户端”启动客户端进程--接着点击“连接”按钮,让客户端连接到socket服务器 6、在客户端的“消息”栏输入信息,然后点击“发送”按钮 7、点击服务器端进程,应该可以看见客户端发送过来的消息,然后可以在“消息”栏输入响应信息,然后点击“发送”按钮,此时会在客户端进程看服务器端进程响应的信息 该示例是实现了一个客户端对象对应一个服务端对象的socket的网络编程--最简单的VC++的网络编程示例。该示使用主要是自定义一个类--它继承MFC库CAsyncSocket类,然后重写OnAccept, OnSend, OnReceive和OnClose方法来实现一对一的VC++的socket网络编程。注意:自定义类关联应用向导生成的对话框类,需要在头文件书写语句“class CHelloSocketDlg;”,并且在.cpp文件写入语句“#include "HelloSocketDlg.h";”,否则编译不会通过! 本示例使用Dialog模式的UI是为方便说明socket编程,在对话框类的OnInitDialog方法有初始化的成员变量的注释说明,在自定义类的注释非常详细。本人觉得MFC使用异步通信类CAsyncSocket实现Java的ServerSocket类和Socket类的编程效果,是非常牛的!(虽然本人认为它还封装得不够OO--因为它封装得让使用者觉得“很傻很天真”)。
一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能) 环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器端工程,选默认的端口1008 3、然后运行客户端工程,选默认的端口1008和默认的服务器地址 4、再运行多个客户端进程 5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息 实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java的编程思想一样,只不过Java会使用多线程技术,在Vector集合保存客户端的socket对象 ,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录,然后在工程分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧