我的VB作品|初学指南|编程技巧|源码下载|工具控件|VBA应用|Blog|【电信线路】|【网通线路】
   位置: VB知识库 >> 源码下载 >> VB实例源码 >> 正文

  • 当前没有记录!
  • 最新调查
        你是怎样知道VB知识库的?
    通过搜索引擎
    即时通讯工具
    朋友介绍
    友情链接
    其它

      

    频道统计
    利用Winsock实现的聊天室和对话系统[VB知识库-Visual Basic Knowledge base]
    利用Winsock实现的聊天室和对话系统[VB知识库-Visual Basic Knowledge base]
     更新时间:2008-1-15 20:55:02  点击数:17
    【字体: 字体颜色

    在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intranet虽然可以建立聊天室,但实现点对点实时对话却比较困难。本人用Winsock和VB自制了一套聊天室和对话系统,特拿来供同行们参考。

    一·Winsock的主要属性、事件和方法

    Winsock是不可见控件,控件文件名是MSWINSCK.OCX,全称为Mcirosoft winsock control,使用时要将此控件调入工具箱。

    1·属性:①Protocol=0 //使用TCP协议;

    ②RemoteHost //准备连接远程机的IP地址

    ③RemotePort //连接远程机的IP端口号 (1024—65535之间)

    ④LocalPort //本地机监听IP端口号必须与呼叫机端口号相同

    2·方法:①connect //申请连接远程机

    ②listen //设置监听

    ③accept //建立实际连接

    ④senddata //发送数据

    ⑤getdata //接收数据

    ⑥close //关闭连接

    3·事件:①connectionrequest //一方请求连接时另一方产生

    ②connect //一方机接受连接时另一方产生

    ③close //一方机关闭连接时另一方产生

    ④dataArrival //一方发送数据另一方产生

    ⑤error //请求连接失败时产生

    二·制作方法

    ⑴ 在一工程中添加两个表单form1(模拟客户端)、form2(模拟服务器端)。

    form1中装入控件:

    控件名
    主要属性
    用 途

    VB.Form form1
    caption=”雷萌聊天室”

    controlbox=0 ‘False
    模拟客户机表单

    VB.Textbox text1
    multiline=-1 ‘True

    scrollbars=3 ‘Bath
    用于输入发往聊天室的信息

    VB.Textbox text2
    locked=-1 ‘True

    multiline=-1 ‘True

    scrollbars=3 ‘Bath
    显示从聊天室发来的信息

    VB.Combobox combo1
    text=”10.84.234.11” ‘任定默认地址
    放入常用的地址

    VB.Commandbutton comm1
    caption=”退出”
    最小化form1

    VB.Commandbutton comm2
    caption=”连接”
    请求与输入的地址连接

    VB.Commandbutton send
    caption=”发送”
    发送Text1中的内容

    VB.Label label1
    caption=“请在此输入发表的信息”
    Text1的框标

    VB.Label label2
    caption=“聊天室或对方的信息”
    Text2的框标

    VB.Label label3
    caption=”等待连接”
    显示连接状态信息

    VB.Label label4
    caption=”聊天室或对方地址”
    用于指示Combo1

    VB.Label label5
    caption=”操作:选地址连接,连接成功看到聊天室内容后再输信息发送”
    操作说明

    VB.Timer timer1
    interval=6000; enabled=false
    防止连接超时

    MSWinsocklib.winsock a

    用于数据传输






    form2中装入控件:

    控件名
    主要属性
    用 途

    VB.Form form2
    caption=”接收信息”

    controlbox=0 ‘False
    模拟客户机表单

    VB.Commandbutton command1
    caption=”返回”
    隐含Form2窗口

    VB.Commandbutton command2
    caption=”对话”
    点对点会话时用此直接启动Form1

    VB.Textbox text1
    locked=-1 ‘True

    multiline=-1 ‘True

    scrollbars=3 ‘Bath
    存放聊天或对话内容

    VB.Label label1
    caption=”接收的信息”
    Text1的框标

    MSWinsocklib.Winsock a

    用于监听

    MSWinsocklib.Winsock b

    用于传送聊天信息




    ⑵ 在Form1的各控件事件中加入如下代码:

    Dim flag As Boolean 注释:连接状态变量



    Private Sub a_Connect()

    flag = True

    End Sub



    Private Sub a_DataArrival(ByVal bytesTotal As Long)

    Dim i As String

    a.GetData i

    Label3.Caption = "连接成功!"

    Comm2.MousePointer = 0

    Form1.MousePointer = 0

    Timer1.Enabled = False

    If i = Chr(0) Then

    Text2.Text = "你是今天第一个进入本聊天室的客户。" + Chr(13) + Chr(10)

    Else

    Text2.Text = Text2.Text + i

    End If

    Text2.SelStart = Len(Text2.Text)

    Send.MousePointer = 0

    Combo1.Enabled = False

    Comm2.Caption = "断开连接"

    Text1.SetFocus

    End Sub



    Private Sub a_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

    flag = False

    Timer1.Enabled = False

    Comm2.MousePointer = 0

    Form1.MousePointer = 0

    MsgBox "网络连接失败 !"

    Label3.Caption = "等待连接"

    Combo1.Enabled = True

    Combo1.SetFocus

    a.Close

    Comm2.Caption = "连接"

    End Sub



    Private Sub Comm1_Click()

    a.Close 注释:关闭连接

    Form1.WindowState = 1

    End Sub



    Private Sub Comm2_Click()

    If Comm2.Caption = "断开连接" Then

    a.Close

    Comm2.Caption = "连接"

    Label3.Caption = "等待连接"

    Combo1.Enabled = True

    Timer1.Enabled = False

    Comm2.MousePointer = 0

    Form1.MousePointer = 0

    Else

    Text2.Text = ""

    Label3.Caption = "正在连接.."

    Comm2.MousePointer = 11

    Form1.MousePointer = 11

    Timer1.Enabled = True

    flag = False

    a.Protocol = sckTCPProtocol

    a.RemoteHost = Combo1.Text

    a.RemotePort = 3000

    a.Connect

    End If

    End Sub



    Private Sub Form_DblClick()

    If MsgBox("关闭本聊天室! 确认吗?", 36, "退出系统") = 6 Then

    End

    Else

    Form1.WindowState = 1

    End If

    End Sub



    Private Sub Form_Load()

    If App.PrevInstance Then

    MsgBox "本系统已经加载,请看任务拦!", 48, "提示"

    End

    End If

    flag = False

    Load Form2 ‘读入form2进入监听

    End Sub



    Private Sub Send_Click()

    Dim S As String

    On Error GoTo ffff ‘防止链路中断

    Send.MousePointer = 11

    If Right(Text1.Text, 1) <> Chr(10) Then

    S = Text1.Text + Chr(13) + Chr(10)

    Else

    S = Text1.Text

    End If

    If flag Then

    a.SendData S

    End If

    Exit Sub

    ffff:

    MsgBox "连接中断!", 48, "提示"

    a.Close

    Send.MousePointer = 0

    Comm2.Caption = "连接"

    Label3.Caption = "等待连接"

    Combo1.Enabled = True

    Comm2.MousePointer = 0

    Form1.MousePointer = 0

    Exit Sub

    End Sub



    Private Sub Timer1_Timer()

    flag = False

    Timer1.Enabled = False

    Comm2.MousePointer = 0

    Form1.MousePointer = 0

    MsgBox "网络连接失败(超时) !"

    Label3.Caption = "等待连接"

    Combo1.Enabled = True

    Combo1.SetFocus

    a.Close

    Comm2.Caption = "连接"

    End Sub



    ⑶ 在Form2的各控件事件中加入如下代码:

    Const maxn = 200 ‘最大同时连接本机的客户数

    Dim user(maxn) As Boolean



    Private Sub Command1_Click()

    Form2.Hide

    End Sub



    Private Sub Command2_Click()

    Load Form1

    Form1.Show

    End Sub



    Private Sub Form_Load()

    Dim str1 As String

    Form2.Caption = "雷萌通信软件"

    注释:winsock控件 a 作为服务器程序监听

    a.LocalPort = 3000

    a.Listen

    End Sub



    Private Sub a_ConnectionRequest(ByVal requestID As Long)

    Dim i As Long

    For i = 1 To maxn ‘当一客户请求时给启动一Winsock控件标志号

    If Not user(i) Then

    user(i) = True

    Exit For

    End If

    Next i

    If i > maxn Then

    Exit Sub

    End If

    Load b(i) ‘当一客户请求时启动一Winsock控件

    b(i).Accept requestID 注释:实际建立连接

    If Text1.Text = "" Then 注释:发送数据

    b(i).SendData Chr(0)

    Else

    b(i).SendData Text1.Text

    End If

    Form2.Show

    End Sub



    Private Sub s_Close(Index As Integer)

    b(Index).Close 注释:关闭连接

    Unload b(Index) 注释:卸载 一个WinSock 控件

    user(Index) = False

    End Sub



    Private Sub b_DataArrival(Index As Integer, ByVal bytesTotal As Long)

    Dim str As String

    Dim i As Long

    b(Index).GetData str

    Text1.Text = Text1.Text + str

    For i = 1 To maxn

    If user(i) Then

    b(i).SendData str

    End If

    Next i

    End Sub

    三·运行

    本程序在VB6.0中编译通过,运行后最小化到任务栏上,也可以用API的Shell_Notifyicon 函数做入右下角的指示器栏中常驻内存。你可以在网络中用一个固定的机器地址作为聊天讨论室,其他用户都选该机地址连接进入该室聊天或讨论。各用户也可选各自熟悉的地址进行连接对话,双击form1空白处从内存中撤出系统。根据同样的原理可以制作电子邮件系统。
    至少要成为本站的注册会员才能下载! 注册点我!
  • 上一篇: 利用MAPI实现收发电子邮件
  • 下一篇: Windows Shell接口之VB实现
  • 发表评论   告诉好友   打印此文  收藏此页  关闭窗口  返回顶部
    热点文章
     
    推荐文章

  • 当前没有记录!
  •  
    相关文章
    网友评论:(只显示最新5条。)
    河北宝宝网河北教育网址导航VB知识库点击申请点击申请点击申请点击申请点击申请点击申请点击申请
    点击申请点击申请点击申请点击申请点击申请点击申请
    Copyright© 2008 vbkbase.com All Rights Reserved QQ群:54150844
    冀ICP备08000517号