服务器是ASP+IIS 
不可改动,只提供消息接口
客户端要做成窗口界面
也算是C/S模式吧?问题:
客户端post方式提交数据,这个没大问题,可以用idHttp实现。但是,在服务端处理完数据之后要返回消息,也是post方式,且需要一个url地址,客户端应该怎样做才能实现?应该用何组件?还是只能用网站?如果有例子最好,本人delphi新手,谢谢!

解决方案 »

  1.   

    你说的url是什么,是服务端传过来返回字符串,还是你自己定义的?
      

  2.   

    url是一个服务器返回结果时要调用的页面地址 简单点说吧
    如果ASP网站要用post方式向客户端返回操作结果等消息,如果客户端也是ASP网站,则应有一个专门接收操作结果的页面,比方说是backurl.asp,那么服务端也就是调用http://www.client.com/backurl.asp?esult=xxx&result2=xxx&……
    那么,如果客户端不用ASP网站做,而用delphi做成窗口界面,应该怎么办?怎样才能实现接收服务器post 来的消息(服务端是不可改变的,因为是要接入人家的系统,人家是不会给改的)
      

  3.   

    用IdHttp就可以了,Post后会返会页面的内容,你自己解析页面的内容,处理返回结果就行了
      

  4.   


    好像不是这么简单地
    服务器网站还要主动给客户端发送数据的
    不只是客户端请求后返回数据
    这样用idHttp行吗?
      

  5.   


     我实现了
     
     http://www.boomkit.cn
      

  6.   

    client/webserver,就是这种机制:
    http://blog.csdn.net/sz_haitao/archive/2009/09/10/4539228.aspx
      

  7.   


    从你的这段描述来看, 服务端是按HTTP协议在调用客户端的页面, 而不是你前面所说的用post方式向客户端返回操作结果。说实话,没看明白你的意图。
      

  8.   

    做个HTTP服务器,处理 POST 和 GET 请求即可。
      

  9.   

    果ASP网站要用post方式向客户端返回操作结果等消息,如果客户端也是ASP网站,则应有一个专门接收操作结果的页面,比方说是backurl.asp,那么服务端也就是调用http://www.client.com/backurl.asp?esult=xxx&result2=xxx&…… 
    那么,如果客户端不用ASP网站做,而用delphi做成窗口界面,应该怎么办?怎样才能实现接收服务器post 来的消息(服务端是不可改变的,因为是要接入人家的系统,人家是不会给改的) 
      

  10.   

    最简单地办法就是自己实现一个http server的前置程序,比如采用lighttpd或Nginx,在里面解析命令字,需要IIS做的,提交给IIS,需要自定义的,就自己加实现方式。我用这个方式实现了webim与客户端IM的通信。因为服务器是linux,Nginx采用了epoll,而且webim发送的信息量非常少,同时几万用户在线很容易实现的。
      

  11.   

    url是一个服务器返回结果时要调用的页面地址 
      

  12.   

    这世道  现在还有人用delphi 
    这东西已经基本没有人搞了  很多接口什么的 都已经落后太多了
    如果你用最新的JAVA 或 .NET 平台 比delphi不知道要快多少倍
      

  13.   

    CString strDescript = _T("");
    bool bRet = false;
    CString strServer, strObject, strHeader, strRet;
    unsigned short nPort;
    DWORD dwServiceType;
    CString strUrl = _T("http://localhost:1000/test.aspx");
    CString strPara = _T("UserName=guan&passwd=123");     CString strContent=_T(""); if(!AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort))
    {
    strDescript = strUrl + _T("不是有效有网络地址!");
    AfxMessageBox(strDescript);
    return ;
    }
    CInternetSession sess;//Create session CHttpFile* pFile;
    //////////////////////////////////////////////
    CHttpConnection *pServer = sess.GetHttpConnection(strServer, nPort); 
    if(pServer == NULL)
    {
    strDescript = _T("对不起,连接服务器失败!");
    AfxMessageBox(strDescript);
    return ;
    }
    pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject,NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT); 
    if(pFile == NULL)
    {
    strDescript = _T("找不到网络地址") + strUrl;
    AfxMessageBox(strDescript);
    return ;
    } //        pFile -> AddRequestHeaders("Content-Type: text/xml; charset=utf-8");
    pFile -> AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded")); 
    pFile -> AddRequestHeaders(_T("Accept: */*")); 
    pFile -> SendRequest(NULL, 0, (LPTSTR)(LPCTSTR)strPara, strPara.GetLength());  CString strSentence;
    DWORD dwStatus;
    DWORD dwBuffLen = sizeof(dwStatus);
    BOOL bSuccess = pFile->QueryInfo(
    HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
    &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>=  200 && dwStatus<300) 
    {
    char buffer[2049];
    memset(buffer, 0, 2049);
    int nReadCount = 0;
    while((nReadCount = pFile->Read(buffer, 2048)) > 0)
    {
    strContent += buffer;
    memset(buffer, 0, 2049);
    }
    bRet = true;
    }
    else
    {
    strDescript = _T("网站服务器错误") + strUrl;
    AfxMessageBox(strDescript);
    bRet = false;
    }
    ////////////////////////////////////////
    AfxMessageBox(strContent);
    pFile->Close();
    sess.Close();
      

  14.   

    你的C端要有一个80口的监听进程。对收到的数据,做简单的处理。若做全面的处理,那就是一个Web服务了!
    服务端能用POST回送数据,这意味实现"推"的功能,这是B/S所不能作到的,也是C/S的优点。一般C/S系统,C端与S端的通信一般是不用HTTP协议的方式的。而你这里要S能POST回信息,即要用类视HTTP协议的方式来传,也是可以的。
      

  15.   

    无论如何,你需要服务器主动向客户端发送数据的话,你是不能通过服务器访问客户端提供的页面来实现的,因为你的客户端可能处于内网,服务器根本不可能找到客户端的机器。客户端向服务器post数据这没有什么问题,也没什么难度,关键是服务器怎么异步将数据传到客户端,建议参考一些即时通信的技术。所谓“推”技术,也是客户端与服务器端建立了tcp长连接,服务器有数据就推过来了而已。这个不难。对于没有做过的人来说也许是个难点。
      

  16.   


    谢谢iuIRCClient的耐心回复。
    我要做的东西确实需要服务器调用客户端进行post,客户端也是有固定IP的,不在内网。
    当然这个服务端不是我设计的,如果是我设计不会搞成这种形式的,但是我无能为力,因为现在是我的老板求人家,我只能在这种框架下开发。实在不行只能IIS+ASP了,这样密合得会更好点吧。
    关于推技术,iuIRCClient这样一说我似乎明白了一些,这个跟普通的TCP连接很相似,只是客户端也有侦听端口主动创建连接的功能,而不只是发送请求接受确认的功能吧,形象一点说就是“服务端双头蛇”吧。呵呵,研究中……
      

  17.   

    用delphi做一个监听程序,我觉得不是很难,难的是对收到的数据,怎么解析和处理(工作量大)。但对你的应用,要接受的数据形式很有限,也就那么几种。若用IIS+ASP那你的C就很庞大了。
      

  18.   

    "所谓“推”技术,也是客户端与服务器端建立了tcp长连接,服务器有数据就推过来了而已。"对如上说法,我想说一点:
    客户端与服务器端建立了tcp长连接,是解决"推"问题的一种方法,且是一种不很完美的方法。
      

  19.   

    确实是这样的
    偶不想用ASP+IIS,这种方式太繁琐,可移植性差(因为要稳定的话OS要用win的server版本)
    如果用delphi能实现是最理想的选择了
    一个独立窗体在XP下随意下载安装……继续等待delphi达人出现~
      

  20.   

    客户端可以打开一个asp页面并传参数,就可以与网页交互了。
      

  21.   

    看来没多大希望了
    只能用ASP做了
    再等最后一天
    明日结帐
      

  22.   

    如果只是接受服务器发送过来的数据,那倒是比较简单,整个serversocket或者idtcpserver的控件,监听80端口就可以了,当然接受数据后可能需要按照http协议返回结果。如果要完整的http功能,估计只能整一个服务器了。
      

  23.   

    看了一下,delphi 还有idhttpserver的(delphi7)。
      

  24.   

    用Indy中的TldHTTPServer组件来完成一个HTTP Server, 是相当容易的。
    Indy中的个Demo,看看就明白了。
      

  25.   

    呵呵,给大家推荐一样东西,很好的,没事去转转
    icoffer,一个非常好的东西,不知道的到百度搜搜
      

  26.   

    是不是可以把s端做成一个ActiveX控件嵌入到你的网站中去呢?这样的话很好处理
      

  27.   

    呵呵,挺有创意的。邀请你一起加入icoffer体验一下,很好的~ 
    一个可以相互分享文件、文档、照片、音乐,3G的永久空间、5G的临时空间,还可以升级呢! 相册,在线听歌,每天还可以免费领取空间哦…… 
    怎么样?试试吧!
      

  28.   

    6楼说得很清楚了,你所要做的就是用IdHttp将命令+参数发给服务器(Url=?action&参数),服务器的ASP网页分析后将结果发回,这时你再通过IdHttp的返回数据分析处理,再次重复以上步骤即可.很简单很清楚的一个CS方式
      

  29.   

    post过去也要有个返回的url吧,抓到后分析你要的那部分就行了,
      

  30.   


    这种方法无法完全实现
    因为C端提供了backurl后
    服务端要不只一次主动去post 消息
    不是C请求S返回那么简单的
    而是反过来的