我想编写一个聊天的服务器程序。我的思路是这样的。请注意:没有具体的CLINET端。
模式是B/S模式,也就是我们通用的聊天室。假定我请求http://61.166.154.14:8080/,这是没有带任何querystring的,服务的守护线程收到后,就发回一个普通的html给你,这个html是带了两个frame的,一个用于显示聊天内容,一个用于发送消息。假如我是从浏览器不停的向服务器请求读数据的话,就象类似的FRAME里东西,要不停刷新。这样做出来的效果是极差劲的。所以我考虑用SOCKET。
在聊天室的关键是:
发言的部分这儿socket一连上以后就close掉了,现在我发一条消息,服务器处理完,然后就close掉。
显示所有对话消息那个frame就有点特殊了,socket连上以后,服务器端取inputstream和outputstream(DELPHI里可能不这么叫,反正是STREAM),然后就保持,一直不close,有新消息出来就直接输出来了。
这样,只要不close,那就是一直连上的,服务器端有什么变化就直接print过来了,客户端也就有变化了。所以这就实现了无刷新技术的动态写到客户端的浏览器,而不是让用户感觉到窗口一直是在刷新的。
其实说白了就是从SERVER端把数据利用STREAM推到BROWER端。
思路基本是这样的,怎么来实现呢?我用TCPSERVER,在ONACCEPT事件中弹出一个对话。例如:我监测我测试服务器(IP:12.2.2.2)的9000端口,当我在浏览器里加一个FRAME让他URL连接到http://12.2.2.2:9000 这个时候会激发SERVER里的事件并且弹出对话框,但是接下来会有错误提示,因为我没有加任何处理,所以SOCKET根本没有什么握手之类的操作,可是现在不允许有CLINET端,从C和JAVA来看都是肯定能完成这样的操作的,在DELPHI中怎么操作呢?记着,客户都是用溜览器的……我觉得必须要用SREAM从SERVER“推”到BROWER……请大家踊跃发言,并且提供好的操作和方法,最好是具体怎么来实现。欢迎讨论。

解决方案 »

  1.   

    我想了好久,还是不能用TCPSERVER,用SOCKET SERVER就可以,其实这个问题的最关键的部分就在于,如果通过SOCKET从应用程序向浏览器写数据,并且写的过程中,SERVER和浏览器之间是SOCKET连接,从SERVER端把数据一直写向浏览器的,直到浏览器关闭。其中我觉得一定会用到TWINSOCKETSTREAM ……怎么?是不是很难?难道没有人过来和我讨论讨论?我一个人边想边自己讨论?
      

  2.   

    难道高手都睡觉了????用JAVA和C都很容易就写出来这些对流的操作了~~怎么DELPHI竟然变得困难?我不想让他们说DELPHI不好用,所以决定用DELPHI写一写,怎么都没有发话的?
      

  3.   

    点对点?天啊,老大,不要让我晕了……服务器还能通过BROWSER点对点的,那IE的漏洞还不数不清了?
    看清楚再说呐~~~~~~是STREAM的问题
      

  4.   

    其实用更简单的说法是如何创立服务程序通过简单的TCP/IP通过对流的操作把数据推到浏览器端不间断显示(无刷新),这个过程是一直连接的。要是传统的脚本编码模式(ASP,JSP等)需要不断刷新是不可取的~
      

  5.   

    可以使用JAVA APPLET来开发CLIENT端。
    如果使用DELPHI来开发的话,就必须在使用之前先安装该控件,这样好象不太好。
      

  6.   

    看了贴主一堆话...总是没有理解清楚:)我对HTTP协议了解不多,不过据我所知,
    它是支持'推'模式的,也就是在连接中服务端主动通知客户端.事实上,很多现在用的聊天室就是用了它.然后说到客户端,
    所谓无CLIENT? 就是用IE作客户端?这方面总需要考虑的.
      

  7.   

    至于具体实现服务端的编程.
    DELPHI自带的TServerSocket,TIDHttp,TIDTCPServer,TTCPServer
    任一个都可以用吧.
      

  8.   

    APPLET不予以考虑,XP中已经没有他的活头了,TIDHttp,TIDTCPServer,TTCPServer似乎均不可以
      

  9.   

    这是一个WEBSERVICE程序。按照你的想法,你可以在B端放一个ACTIVEX那样或许可以用SOCKET编程。
      

  10.   

    喂喂喂!!!!!!!各位·!!!!不是重点在客户端,也不可以用任何ACTTVE,用C++写出来的聊天室在这里:http://www.ichat.net.cn你们可以到聊天室去感受感受嘛~~~~~至于道理就是我说的那么实现的,至于拿到DELPHI里这里讨论还是希望大家能提高提高~~~~~
      

  11.   

    既然你已经有了c++的代码,那么用delphi实现起来就很容易了!你用c++写的聊天室,跟delphi写的,在逻辑上没有一点区别阿!
      

  12.   

    用stream的server push,不如用client pull.
    也就是利用meta-refresh语句。
    但是服务器的负担会小很多。
      

  13.   

    HTTP协议的连接建立主动权在SERVER,所以任何SOCKET控件都可简单实现这问题的,就是SERVER不要关闭SOCKET,一有数据就向CLIENT SOCKET写入.只有多次写入出错才认为CLIENT已经关闭IE了.SERVER自己管理一个SOCKET的列表就行,太简单了.