要用VB6的WINSOCK做一个仿QQ聊天的简单程序,但是搞了一段时间都无法入门。
请高手帮忙写一个简单的聊天程序,要求用UDP协议传送信息,并且在互联网上(而不是单单局限于局域网)可用。
如果有好的程序,提供下载的链接也行。
先谢谢了!

解决方案 »

  1.   

    局域网中可以 公网(互联网)上也可用服务端:
    Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .LocalPort = XXX'服务端口号
    .Bind XXX'服务端口号
    End With
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '收到数据
    Dim strdata As String
    Winsock1.GetData strdata, vbString
    '处理数据 比如转发给他人
    end sub客户端:
    Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .RemoteHost = XXX'服务IP
    .RemotePort = XXX'服务端口
    End With
    End SubPrivate Sub command1_click()
    '发送数据
    Winsock1.SendData "XXX" '发送的数据
    End Sub这是最基本你要做成类似QQ那样的 还需要很大的工作量 比如 通信协议(例如B客户要发送给A客户) 数据库记录用户信息(比如用户身份信息 用户端的IP及端口等)
      

  2.   

    这边下载的到:http://www.codesky.net/showhtml/11727.htm
      

  3.   

    这是俺给另一个贴子的回复:
    每个客户端均有三个winsock控件,一个用于监听,一个用于与服务器的连接和会话,一个用于与其它客户端的连接和会话。 
    服务器有一个winsock控件和一个winsock控件数组,前者用于监听,后者用于处理连接和会话。 
    当客户端用处理连接和会话的控件向服务器端发往连接请求后,服务器端循环判断控件数组里是否有空闲的,如果没有,则动态增加一个,如果有,则使用它,接受客户端连接后,服务器端通过循环向每一个已连接的客户端发送当前所有已连客户端的IP地址,客户端接到后,刷新IP列表,然后由用户自己决定选择跟哪一个客户端会话,选择后,向对方客户端发送连接申请,接受后便可以进行客户端对客户端之间的通讯了。 
    如果想要实现同时与多个客户端进行通讯,将用于与其它客户端的连接和会话的winsock可设成控件数组即可。
      

  4.   

    '客户端:
    Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .RemoteHost = "212.96.128.86" '服务IP
    .RemotePort = 1001 '服务端口
    End With
    End SubPrivate Sub command1_click()
    '发送数据
    Winsock1.SendData Text2.Text '发送的数据
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '收到数据
    Dim strdata As String
    Winsock1.GetData strdata, vbString
    '处理数据 比如转发给他人
    Text1.Text = strdata
    End Sub'服务端:
    Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .RemoteHost = "156.29.54.246" '服务IP
    .LocalPort = 1001 '服务端口号
    .Bind 1001 '服务端口号
    End With
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '收到数据
    Dim strdata As String
    Winsock1.GetData strdata, vbString
    '处理数据 比如转发给他人
    Text1.Text = strdata
    End SubPrivate Sub command1_click()
    '发送数据
    Winsock1.SendData Text2.Text '发送的数据
    End Sub
    这样两个程序在远程无法通讯.
      

  5.   

    修改为下面的也不行,只能在同一台机上可以,上到互联网就不行。
    求高手指点迷津:A机:Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .RemoteHost = "166.29.61.159" '远程主机IP
    .RemotePort = 1002 '远程主机端口
    .LocalPort = 1001 '本地主机端口
    .Bind 1001 '保留本地主机端口
    End With
    'Winsock1.Connect RemoteHost, RemotePort
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '收到数据
    Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString
    '处理数据 比如转发给他人
    Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then
          MsgBox "错误,可能是远程未启动。" ' handle the error here
       End IfEnd SubPrivate Sub command1_click()
    '发送数据
    Winsock1.SendData Text2.Text '发送的数据
    Text1.Text = Text1.Text & Text2.Text & vbCrLf
    Text2.Text = ""
    End SubB机:Private Sub Form_Load()
    With Winsock1
    .Protocol = sckUDPProtocol
    .RemoteHost = "202.29.67.90" '远程主机IP
    .RemotePort = 1001 '远程主机端口
    .LocalPort = 1002 '本地主机端口
    .Bind 1002 '保留本地主机端口
    End With
    'Winsock1.Connect RemoteHost, RemotePort
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    '收到数据
    Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString '获取远程发来的信息
    '处理数据 比如转发给他人
    Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then
          MsgBox "错误,可能是远程未启动。" ' handle the error here
       End IfEnd SubPrivate Sub command1_click()
    '发送数据
    Winsock1.SendData Text2.Text '发送的数据
    Text1.Text = Text1.Text & Text2.Text & vbCrLf
    Text2.Text = ""
    End Sub
      

  6.   

    我只想对你说  如果你用UDP 的话 在外网是很麻烦的 没有路由的话 也行 
    和局域网一样 但是有路由后 你必须 牵扯到 UDP 打洞等 很麻烦 用TCP 吧 
    用TCP 很稳定 外网也是可以用的 但是 做聊天室的话 每次都通过服务器群发送
    消息 这样服务器 会很占用资源 如果你还有不懂的 加我吧
      

  7.   

    TCP  做聊天室每次都通过服务器群发送 
    消息 这样服务器 会很占用资源 
    楼上有什么好的技术思想,共享共享!
      

  8.   

    tcp/ip的我有个简单的例子代码,回复在别的贴上了,这里再帖一次吧.  外网访问其实和局域网访问是一样的: 
      局域网是  内网ip+使用的端口, 
      外网是    外网ip+使用的端口. 
      如果你是Adsl,那么每次重起电脑外网ip就会改变,那么你 
    就要下栽一个叫花生壳的软件来绑定一个域名,通过绑定的域 
    名就可以解析出你当前的外网ip. 
      如果你又用了家用路由器,那么你就要设置一下你的路由器, 
    在路由器上影射你局域网中要开放给外网的那台电脑的ip+使 
    用的端口.访问的时候还是:外网ip+使用的端口. 
      另外,我看了一下你的代码,好象有点问题,我发个代码给你 
    参考一下,vb6.0的: 
    服务端 
    Private Gac() As Boolean 
    Dim Socknumber As Integer Private Sub Command1_Click(Index As Integer) 
    Select Case Index 
          Case 0 
                Winsock1(0).Close 
                Unload Me       Case 1 
                Command1(1).Enabled = False 
                Command1(2).Enabled = True 
                Winsock1(0).LocalPort = 2600 
                Winsock1(0).Listen 
                Socknumber = 0 
                Frame1.Caption = "服务已经启动" 
          Case 2 
                Command1(1).Enabled = True 
                Command1(2).Enabled = False 
                Winsock1(0).Close 
                Text(0).Text = 0 
                Frame1.Caption = "服务已经停止" 
          End Select 
    End Sub Private Sub Form_Load() 
      Command1(1).Enabled = True 
      Command1(2).Enabled = False 
    End Sub Private Sub Form_Unload(Cancel As Integer)   Winsock1(0).Close 
    End Sub Private Sub Winsock1_Close(Index As Integer) 
      Winsock1(Index).Close 
      Unload Winsock1(Index) 
      Gac(Index) = False 
      Text(0).Text = Int(Text(0).Text) - 1 
    End Sub Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) 
      Socknumber = Socknumber + 1 
      
      Load Winsock1(Socknumber) 
      Winsock1(Socknumber).Accept requestID 
      ReDim Preserve Gac(Socknumber) 
      Gac(Socknumber) = True 
      Text(0).Text = Int(Text(0).Text) + 1 
    End Sub Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) 
      Dim c As String 
      Winsock1(Index).GetData c, vbString 
      Dim i As Integer 
      For i = 1 To UBound(Gac) 
        If Not i = Index Then 
          If Gac(i) Then 
            Winsock1(i).SendData c 
          DoEvents 
          End If 
        End If 
      Next i 
          
    End Sub 客户端: 
    Option Explicit 
    Private Sub Command1_Click() 
          Winsock1.RemoteHost = TextServerIP 
          Winsock1.RemotePort = TextServerPost.Text 
      Winsock1.Connect 
      Command1.Enabled = False 
      Do 
        DoEvents 
        Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError 
      If Winsock1.State = sckError Then 
          Command1.Enabled = True 
          Winsock1.Close 
          Text3.Text = "已与服务器连接失败" + Chr$(13) + Chr$(10) + Text3.Text 
      Else 
        
          Text3.Text = "已与服务器连接成功" + Chr$(13) + Chr$(10) + Text3.Text 
          Command2.Enabled = True 
          Command3.Enabled = True 
      End If 
    End Sub Private Sub Command2_Click()       Winsock1.SendData Text1.Text 
          Text2.Text = "我说的话: " + Text1.Text + Chr$(13) + Chr$(10) + Text2.Text 
          Text1.Text = "" End Sub Private Sub Command3_Click() 
      Winsock1.Close 
      Command1.Enabled = True 
      Command2.Enabled = False 
      Command3.Enabled = False 
      Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text 
    End Sub Private Sub Form_Load()   Command1.Enabled = True 
      Command2.Enabled = False 
      Command3.Enabled = False 
      
    End Sub Private Sub Winsock1_Close() 
      Command1.Enabled = True 
      Command2.Enabled = False 
      Command3.Enabled = False 
      Winsock1.Close 
      Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text 
      
    End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 
      Dim c As String 
      Winsock1.GetData c, vbString 
      Text2.Text = "对方说的话: " + c + Chr$(13) + Chr$(10) + Text2.Text 
    End Sub