多线程、Socket技术及委托技术的关系

来源:论坛整理 作者:xuanner 2007-12-01 出处:pcdog.com

qq  

  这几天忙着开发一个竞赛软件,要求一个前端的显示,幕后操控前端显示给竞赛者,这就要用到多线程、Socket技术及委托技术。于是在网上找了一些关于Socket技术的资料,加上学过的线程的一点知识,开始我的整合编程。
深知自己一直都对VB没怎么兴趣的,感觉他不是真正的编程,VB是易学,易懂,易理解,想想还是花点时间学下,感觉有一天会有用的,于是一时心血来潮,凭着自己埋头苦干的边学东西边做软件,还好有其他编程软件的一点经验吧,没走偏了,一直都很想写个文章做个纪念,最令我深刻的、学到最有用的东西也就是多线程、Socket技术、委托技术。现在开始我的VB编程:

  第一步:什么是多线程?如果一个窗体里创建一个线程,他就是一个多线程,是两个线程的多线程,窗体显示及控件的管理本身就有一个线程控件,叫UI线程(自己理解应该是用户界面的线程吧!!呵呵),是主线程,而创建的线程则是子线程。那么什么是Socket呢?Socket就是套接字,通过Socket,有可以作为Server端的Socket,也有作为Client端的Socket,服务端开启一个子线程来监听客户端发来的所有信息,并可以发送回信息,实现数据双向通信。聊天软件很多都是基于Socket的编写出来的。好了,什么是委托技术呢?简单的说是就有一个人,他没有能力完成想要做的事,出钱委让给别人去完成,像某某公司经理要求你开发个竞赛软件,他本身没有能力去完成这样的事,所以出钱让你去完成。好了,明白了是什么后,接下来写下一些代码吧!!!!!

  第二步:多线程例子

  VB中多线程可以传值

多线程、Socket技术及委托技术的关系(图一)Dim th as System.Threading.Thread
多线程、Socket技术及委托技术的关系(图二)th = New System.Threading.Thread(Addressof 对象名(或类名).方法)
多线程、Socket技术及委托技术的关系(图三)对象名(或是类名).属性 = 值       '通过这样可以实现线程传参
多线程、Socket技术及委托技术的关系(图四).......
多线程、Socket技术及委托技术的关系(图五)th.start()

  也可以返回值(通过委托技术实现),在做竞赛软件时,遇到一个问题,当在子线程里面去New 一个Form或是控件时,都会使窗体出现假死,于是在网上找了一些资料及查MSDN后才知道,原来子线程是没有能力去操控UI线程的控件,这里只能用委托技术,--------------------------这个是很好的一个说明==========呵呵=========

多线程、Socket技术及委托技术的关系(图六)Dim th as System.Threading.Thread
多线程、Socket技术及委托技术的关系(图七)th = New System.Threading.Thread(Addressof 方法名1)
多线程、Socket技术及委托技术的关系(图八)th.start()
多线程、Socket技术及委托技术的关系(图九)
多线程、Socket技术及委托技术的关系(图十)Delegate Sub DelegateHandler(ByVal 参数 as String)   '声明一个委托
多线程、Socket技术及委托技术的关系(图十一)private Sub 方法名1()
多线程、Socket技术及委托技术的关系(图十二)    dim dh as DelegateHandler = New DelegateHandler(AddressOf 方法名2)
多线程、Socket技术及委托技术的关系(图十三)多线程、Socket技术及委托技术的关系(图十四)    me.invoke(dh, new Object()...{"value"})
多线程、Socket技术及委托技术的关系(图十五)End Sub
多线程、Socket技术及委托技术的关系(图十六)
多线程、Socket技术及委托技术的关系(图十七)private Sub 方法名2(ByVal str as String)
多线程、Socket技术及委托技术的关系(图十八)    '被委托给的方法    ,处理委托后的数据
多线程、Socket技术及委托技术的关系(图十九)
多线程、Socket技术及委托技术的关系(图二十)End Sub
多线程、Socket技术及委托技术的关系(图二十一)

  第三步:Socket技术例子

  (1)服务器端

  Socket是基于线程而创建的,在UI线程下创建子线程,线程方法中用一个死循环在监听客户端的信息,第收到一信息后,委托给UI线程方法去处理。示例代码:

多线程、Socket技术及委托技术的关系(图二十二)'声明一个线程
多线程、Socket技术及委托技术的关系(图二十三)Dim t As System.Threading.Thread
多线程、Socket技术及委托技术的关系(图二十四) t = New Thread(AddressOf WaitData)
多线程、Socket技术及委托技术的关系(图二十五) t.Start()

多线程、Socket技术及委托技术的关系(图二十六)
多线程、Socket技术及委托技术的关系(图二十七)    Dim s As Socket
多线程、Socket技术及委托技术的关系(图二十八)多线程、Socket技术及委托技术的关系(图二十九)    Public Sub WaitData()Sub WaitData()
多线程、Socket技术及委托技术的关系(图三十)        s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
多线程、Socket技术及委托技术的关系(图三十一)        Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 1024)
多线程、Socket技术及委托技术的关系(图三十二)        s.Bind(localEndPoint)
多线程、Socket技术及委托技术的关系(图三十三)        s.Listen(100)
多线程、Socket技术及委托技术的关系(图三十四)        Me.dealData(s)
多线程、Socket技术及委托技术的关系(图三十五)    End Sub
多线程、Socket技术及委托技术的关系(图三十六)
多线程、Socket技术及委托技术的关系(图三十七)多线程、Socket技术及委托技术的关系(图三十八)    Private Sub DealData()Sub DealData(ByRef sock As Socket)
多线程、Socket技术及委托技术的关系(图三十九)        While (True)
多线程、Socket技术及委托技术的关系(图四十)            Dim bytes As Byte() = New Byte(1024) {}
多线程、Socket技术及委托技术的关系(图四十一)            Dim ss As Socket = s.Accept()
多线程、Socket技术及委托技术的关系(图四十二)            i = ss.Receive(bytes)
多线程、Socket技术及委托技术的关系(图四十三)            Dim valstr As String = Encoding.Default.GetString(bytes, 0, i)
多线程、Socket技术及委托技术的关系(图四十四)            '处理接收到的数据
多线程、Socket技术及委托技术的关系(图四十五)      '见第二步线程与委托技术
多线程、Socket技术及委托技术的关系(图四十六)
多线程、Socket技术及委托技术的关系(图四十七)      '发送回数据
多线程、Socket技术及委托技术的关系(图四十八)      ss.Send(Encoding.Default.GetBytes("已收到!!Love you"))            '发回数据
多线程、Socket技术及委托技术的关系(图四十九)        End While
多线程、Socket技术及委托技术的关系(图五十)    End Sub

  (2) 客户端

  只要求连接到服务器端,然后就Send数据,同时可以Receive数据。示例代码如下:

多线程、Socket技术及委托技术的关系(图五十一)       Try
多线程、Socket技术及委托技术的关系(图五十二)            Dim bytes As Byte() = New Byte(1024) {}
多线程、Socket技术及委托技术的关系(图五十三)            s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
多线程、Socket技术及委托技术的关系(图五十四)            Dim localEndPoint As New IPEndPoint(IPAddress.Parse("127.0.0.1"), 1024)
多线程、Socket技术及委托技术的关系(图五十五)            s.Connect(localEndPoint)
多线程、Socket技术及委托技术的关系(图五十六)
多线程、Socket技术及委托技术的关系(图五十七)            s.Send(Encoding.Default.GetBytes("要发送的数据"))
多线程、Socket技术及委托技术的关系(图五十八)            s.Receive(bytes)
多线程、Socket技术及委托技术的关系(图五十九)            '处理接收到的数据
多线程、Socket技术及委托技术的关系(图六十)
多线程、Socket技术及委托技术的关系(图六十一)        Catch ex As Exception
多线程、Socket技术及委托技术的关系(图六十二)
多线程、Socket技术及委托技术的关系(图六十三)        Finally
多线程、Socket技术及委托技术的关系(图六十四)           s.Close()
多线程、Socket技术及委托技术的关系(图六十五)        End Try

  第三步:委托技术

  其实就几步,声明委托、New一个委托并指定委托方法、调用invoke()方法,可以参考第一步。示例代码:

多线程、Socket技术及委托技术的关系(图六十六)多线程、Socket技术及委托技术的关系(图六十七)Delegate Sub DelegateHandler()Sub DelegateHandler(ByVal str As String)         '声明一个委托
多线程、Socket技术及委托技术的关系(图六十八)Dim dh As DelegateHandler = New DelegateHandler(AddressOf 方法名)       'New 出一个委托并指定委托方法
多线程、Socket技术及委托技术的关系(图六十九)Me.invoke(dh, New Object(){"传递的参数"})                   '调用invoke方法
多线程、Socket技术及委托技术的关系(图七十)
多线程、Socket技术及委托技术的关系(图七十一)多线程、Socket技术及委托技术的关系(图七十二)Private Sub 方法名()Sub 方法名(ByVal str As String)
多线程、Socket技术及委托技术的关系(图七十三)        '处理委托的数据str
多线程、Socket技术及委托技术的关系(图七十四)
多线程、Socket技术及委托技术的关系(图七十五)End Sub
多线程、Socket技术及委托技术的关系(图七十六)


上一篇:Visual Basic 9不完全入门之LINQ简介
下一篇:VC2005中System::String转换为std::string