设计要求:
1。服务端使用winsock,1个服务器可容纳1000人以上
2。客户端使用IE,不包含axtivex控件
3。使用80端口连接服务器已了解的东西:
曾经尝试使用MSDN的方法,服务端用一个winsock监听,winsock组循环接受客户端请求,一旦有连接近来间隔10秒向客户端发送HTML注释代码。客户端使用两个Frame,一个一直连线用来接受聊天信息(可以连续接受到服务器端发送的代码),另一个准备用来向服务器发送信息。未了解的东西:
1、客户端如何向服务器发送信息。
2、基于winsock的chatserver编写思路

解决方案 »

  1.   

    没有人感兴趣?贴一个垃圾代码供各位参考Server
    ==========
    Private Sub Form_Load()
        Winsock1.LocalPort = Text1.Text
        Winsock1.Listen
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
        Winsock2.Accept requestID
        List1.AddItem "有个连接近来了"
    End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
        Winsock2.GetData ABC
        List1.AddItem bytes2BSTR(ABC)
    End SubFunction bytes2BSTR(vIn)
        Dim strReturn
        Dim i1, ThisCharCode, NextCharCode
        strReturn = ""
        For i1 = 1 To LenB(vIn)
            ThisCharCode = AscB(MidB(vIn, i1, 1))
            If ThisCharCode < &H80 Then
                strReturn = strReturn & Chr(ThisCharCode)
            Else
                NextCharCode = AscB(MidB(vIn, i1 + 1, 1))
                strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
                i1 = i1 + 1
            End If
        Next
        bytes2BSTR = strReturn
    End FunctionClient
    ==============
    Private Sub Command1_Click()
        Winsock1.RemoteHost = Text1.Text
        Winsock1.RemotePort = Text2.Text
        Winsock1.LocalPort = 6666
        Winsock1.Connect
    End Sub
    Private Sub Command2_Click()
    Winsock1.SendData Text3.Text
    End Sub==========================================
    很奇怪为什么用activex发送的数据是乱码,所以还加了一个bytes2BSTR(vIn)来解码
      

  2.   

    你还不如用ASP来写好点  何必那么费劲呢?
      

  3.   

    ASP负载1000人同时在线有一定困难...而且效率也是受影响
      

  4.   

    1。服务端使用winsock,1个服务器可容纳1000人以上
    2。客户端使用IE,不包含axtivex控件
    3。使用80端口连接服务器HTML的客户端脚本本身是不能开端口访问远程服务器的,你还是需要安装ActiveX控件的。
      

  5.   

    而且C/S模式的连接,1000人同时在线的效率不见得可以比B/S模式的高。
      

  6.   

    TO:TechnoFantasyHTML的客户端脚本本身是不能开端口访问远程服务器的..
    ---------
    应该是可以连接的把..下面这个程序可以接收到 IE的信息Private Sub Form_Load()
    Winsock1.LocalPort = 80
    Winsock1.Listen
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
        Winsock2.Accept requestID
        MsgBox "OK"
    End Sub
      

  7.   

    TechnoFantasy提供点建议吧...你都是有5个星星的人了
      

  8.   

    这想法可以.不过实现的成本相对B/S要高出很多.且,效益可能不高...
    客户端不安ActiveX也行,用WinSock摸拟WebServer.想一想就知道有多麻烦...客户端发送信息使用"网页表单提交"这样.POST到WinSock!当WinSock收到这个信息,交给程序生成HTML页面,再交给Winsock返回给所有连接.哇,头晕.还要处理私聊,等等特殊情况.简直是蛮干...相比起几个ASP脚本+一个HTML框架的B/S...我不想活了...
      

  9.   

    To : TechnoFantasy
    服务器性能应该问题不大
    CUP双至强2.4
    1G内存我了解可能需要建立一个winsock组,创建1000个 启动是花了点时间(10几秒)但不知道还应该注意些什么?
      

  10.   

    VB程序由于单线程特性,可能服务端在负荷大的时候在性能上可能会有问题(用多线程或者C座服务端的另当别论)。需要考虑一下聊天的方式降低服务端程序的负担,是1对1聊天还是类似聊天室的多人聊天。    如果是1对1的方式,可以考虑数据直接在两台计算机中间传输而不用通过服务器中转,这样可以降低服务器的负担。具体方式可以是这样,比如说S是服务器,A和B是客户端。那些什么注册啊、加好友联系人之类的动动我就不说了。A登录S,这时候S就可以记录A的IP和通讯端口(因为可能是从局域网映射到公网的,所以端口不可能固定),这时候B登录了S也登记B的IP和port。然后S查找数据库,发现A和B互为好友,并且双发都没有隐身设置,于是通知A,B上线啦,并且告之B的IP和端口。对于B也作相同的动作。这时候A和B就可以直接进行通讯了。    如果是多人聊天的时候,个人认为在一方发起聊天(比如说开聊天室)之后他的客户端程序可以作为一个小的聊天服务器。这时候,发起方在S上登记一个聊天室,S发出指令,让发起者的客户端称为一个小的聊天室服务器。后来的参与者可以查询到该聊天室的存在,当参与者确定加入聊天室的时候,S告诉参与者来聊天室服务器的地址、端口,于是参与者就可以和聊天室服务器直接通讯,主要的聊天通讯数据就可以通过临时建立的服务器针对房间里的人来广播。当这个临时服务器中断(比如下线、断线)的时候,S立即判断该聊天室内是否还有人,如果有人立即指定另外一个客户端为服务器,承担数据广播的任务,直至所有人下线    个人拙见,仅供参考
      

  11.   

    To: chewinggum
    非常感谢,受益非浅.你提到的是用C/S模式来实现IM软件的架构,如果使用B/S模式(服务器端同样使用winsock编写)情况是什么样呢?
      

  12.   

    使用B/S模式(服务器端同样使用winsock编写)?B/S是指browser/server模式,这里的B是指IE这样的浏览器,那么S就是web服务器。服务端用winscok写?那你就要自己全面实现http协议了。劝你回头,别傻了。
    一般意义上的B/S架构的编程是指编写web应用程序。也就是程序的展示部分用html形式,逻辑处理放在服务器上,这样省去了客户端程序的维护。
      

  13.   

    有一个方法你可以考虑采用一下,就是采用winsock连接池的方法,因为不可能总是固定有1000个用户在线的,如果一个用户断线了,你可以将这个用户使用的winsock设置为空闲供新登录用户使用而不是创建一个新的,除非当前没有空闲的winsock了再创建新的。
      

  14.   

    To: chewinggum
    就性能上来说使用ChatServer应该要优于ASP吧,或者这几个东西的比较是否是对的
    ChatServer > ASP+XMLHttp > 纯ASP ?To:TechnoFantasy
    已经考虑这个方式,轮流使用(接受连接).关键是如何提高form提交过来处理的效率,因为这个连接短开是非常频繁的.是否可以有 winsock + ASP的组合方式?