Vb。net多线程通讯客户端

合集下载

用Visual Basic.NET开发多线程应用程序

用Visual Basic.NET开发多线程应用程序
程序的灵活性。 然而线程并没有 自己的内存空 间, 只有 自己的 堆栈空 间, 因此多个线程必须共享进程 的内存 空间, 这是多线
Dm my hed sT ra ’ i T ra l A hed 这里定义 了两个线程
D m T r a 2 As T r a i my h e d h e d P v t u B t nl Ci ( y a sn e sS s mO - i r ae S b u t o l k B V e drA yt .b c l e

Coi ( y a sn e s O jc, l n s g B V ed rA bet l
i赢 、向众 科 技 网。播 学识开: 利面公 的 学术 站传 科 知 ,
÷ 展学 流, 科 创 探 术交 推进 学 新, 讨热门 题、 跃气 { 话 活
B V s S s m,o p n nMo e C n eE e t rs H n y a e A yt C m l e o e t d 1 a c l v nA g ) a — .

N t框 架为线程提供 了丰富的类 jc,y a e A yt E etrs Hade u o 1 lk主 程程序设计时最大的难点。.e etB V s Ss m.vnA g ) n l B  ̄ n . i l e s Cc
线程 的事件 函数
Dm w r1A e hed r 1 L bl ) i ok sN w T raWok ( ae1 Dm w r2 A e ra Wo 2 L bl i ok sN w T ed r ( ae2) h k my hed : N w T ra A des fw r1 o r ’ T ra 1 e hed( d rsO o . Wok) k D

vb双机通信程序

vb双机通信程序

1.服务器程序Option ExplicitPrivate Sub Form_Load()tcpServer.LocalPort = 8888tcpServer.ListenlblState.Caption = "目前没有客户端连入!"End SubPrivate Sub tcpServer_ConnectionRequest(ByV al requestID As Long)If tcpServer.State <> sckClosed Then tcpServer.ClosetcpServer.Accept requestIDlblState.Caption = "有客户端连入本机!IP:" & tcpServer.RemoteHostIPEnd SubPrivate Sub tcpServer_dataArrival(ByV al bytesTotal As Long)Dim strData As StringtcpServer.GetData strDatatxtOutput.Text = strData & vbCrLf & txtOutput.TextEnd SubPrivate Sub txtSendData_KeyPress(KeyAscii As Integer)If KeyAscii = 13 ThenIf tcpServer.State = sckConnected ThentcpServer.SendData "服务器说:" & txtSendData.TexttxtOutput.Text = "服务器说:" & txtSendData.Text & vbCrLf & txtOutput.Text ElseMsgBox "目前没有连接的客户端!"End IfEnd IfEnd Sub2.客户端程序Option ExplicitPrivate Sub Form_Load()tcpClient. RemoteHost="127.0.0.1"tcpClient. RemotePort=8888End SubPrivate Sub cmdConnect_Click()tcpClient. ConnectEnd SubPrivate Sub tcpClient_Connect()MsgBox"成功连接服务器!" & vbCrLf & _"IP为:" & tcpClient. RemoteHostIPEnd SubPrivate Sub tcpClient_DataArrival(ByV al bytesTotal As Long)Dim strData As StringtcpClient. GetData strDatatxtOutput. Text=strData & vbCrLf & txtOutput. TextEnd SubPrivate Sub txtSendData_KeyPress(KeyAscii As Integer)If KeyAscii=13 ThenIf tcpClient. State=sckConnected ThentcpClient. SendData"客户端说:" & txtSendData. TexttxtOutput. Text="客户端说:" & txtSendData. Text & vbCrLf & txtOutput. TexttxtSendData. Text=""ElseMsgBox"目前没有连接服务器,请单击“连接”按钮连接!"End IfEnd IfEnd Sub。

VB6通过winsock控件数组实现客户端和服务器多对一通信

VB6通过winsock控件数组实现客户端和服务器多对一通信

VB6通过winsock控件数组实现客户端和服务器多对一通信在VB6中使用winsock控件需要引用Microsoft Winsock Control 6.0部件使用winsock控件可以实现客户端和服务器间C/S结构的通信,如果把客户端和服务器放置于同一台电脑中,并且将客户端winsock 的RemoteHost设置为本机IP,则可以实现客户端程序和服务端程序间的自由通信。

在应用程序之间采用winsock通信比内存共享等方法更简单快捷,同时也更安全。

在客户端中添加一个窗体,拖拽一个winsock控件到该窗体上。

RemoteHost代表需要连接的远程服务器IP地址,局域网中的通信可以使用路由器分配的IP地址。

RemotePort代表端口号,服务器和客户端通过该端口进行连接。

当客户端的winsock接收到服务器发送来的数据后会触发Winsock1_DataArrival事件,利用GetData方法可以将数据读取出来,一般来说将数据读取到byte()数组中是最好的,因为利用字节数组可以收发图片、音频等文件,本例中为了演示所以直接用一个字符串变量来读取数据了。

客户端向服务器发送数据可以用SendData方法,该方法同样可以发送字节数组,这里为了演示所以发送了个字符串。

服务器端为了能同时和很多个不同的客户端进行通信,所以需要采用winsock控件数组,在服务器窗体中拖拽一个winsock控件,将其名称更改为Listener,该控件用于接收客户端的连接请求。

再拖拽一个winsock控件到窗体中,然后将其Index属性更改为0,0即代表该控件是一个控件数组,为了使用方便所以把控件名称更改为Sock,该控件数组用于动态的和不同的客户端通信。

在服务器端的窗口中写入如下代码:利用Listener来侦听,代码如下:当有客户端需要连接服务器时会触发Listener_ConnectionRequest事件,此时会遍历Sock控件数组,如果里面有空闲的Sock则用这个空闲的Sock和客户端进行连接,如果没有空闲的则重新Load一个进来。

VB .NET多线程步骤和例程

VB .NET多线程步骤和例程

多线程操作步骤/例程1.定义线程Dim Thread_Process As System.Threading.Thread()2.定义委托函数进程运行过程中不可直接对控件进行操作,可通过定义并构造委托函数的形式操作控件 Sub Thread_SetLVText(ByVal SetString As String, ByVal Obj As TextBox) 3.构造委托函数/过程Sub SetLVTxt(ByVal SetString As String, ByVal Obj As TextBox)Dim OTemp As TextboxOTemp = ObjOTemp.Text = SetStringEnd Sub4.构造线程过程Private Sub ExampleThreading()…同一般过程…End Sub5.调用委托函数/过程a)封装在子过程/函数中,方便调用Sub SetLVTxt_Invoke(ByVal SetString As String, ByVal Obj As TextBox) Dim Obj_GetText As New Thread_SetLVText(AddressOf SetLVTxt)Invoke(Obj_GetText, SetString, Obj)End Subb)直接在进程过程中调用Dim Obj_GetText As New Thread_SetLVText(AddressOf SetLVTxt)Invoke(Obj_GetText, “abc”, TextBox1)6.启动新线程注意给进程赋值时”Address of”后面接线程过程名!!!Thread_Process(i) = New System.Threading.Thread(AddressOf ExampleThreading) Thread_Process(i).SetApartmentState(Threading.ApartmentState.STA) Thread_Process(i).Start()。

VB多线程的几种实现方法概述

VB多线程的几种实现方法概述

VB多线程的⼏种实现⽅法概述转⾃先说多线程:⽅法 1 : CreateThread不⽤多说,万变不离其宗,这是 Win32 内创建线程的唯⼀系统⽅法,以下介绍的多线程创建⽅式虽然不直接接触这个 Win32 APi,但系统也是通过他创建的。

⽅法 2 : TimerSetEvent这个函数是 Win32 系统的⼀个⾼精度计时器函数,通过调⽤这个函数,系统会创建⼀个新的线程,让Timer 回调函数中的代码运⾏在这个新线程中。

⽅法 3 : SHCreateThread很多⼈应该没见过这个函数,这是 shlwapi.dll 的⼀个导出函数,这个函数看字⾯也能理解是个创建多线程的函数,⽽且。

他是基于对象操作的多线程函数,也就是说他能够稳定的运⾏⼀些⽤上⾯2种⽅法创建,但不能稳定运⾏的代码。

⾄少这个函数在 IDE 的环境下表现的中规中矩!使⽤⽅法可查 API-GUIDE⽅法 4 :想起来了, CreateRemoteThread创建远程线程,经测试⼀点也不稳定,根本没法说下去了,还不如直接调⽤ CreateThread但,做为⼀种线程的创建⽅法,还是希望能够熟悉⼀下,如果不⽤VB写代码,要写跨进程线程,这是⼀个简单易⾏的办法,否则只能继续SetWindowHook了,熟悉汇编指令的还可以远程分配内存写硬编码执⾏⽅法 5 :简单说下 ActiveX ⽅式的多线程论坛⾥⾯有⽤这种⽅法实现的稳定多线程,代码虽好,但我却不会⽤,在倡导绿⾊软件的今天,为了⼀个多线程,⽽注册表⾥⾯⼜要多点xx,不好。

⽽且卸载⿇烦。

⽤ ActiveX 创建线程与其他⽅式创建的线程最重要的地⽅要主义,任何VB函数的调⽤最好都建⽴在新线程中新初始化的对象基础上执⾏,不要跨对象调⽤,⽽ ActiveX 的安全线程本⾝也正是利⽤了这点,不知道研究 ActiveX 的⽼⼤们有没注意,利⽤他特性实现的多线程,是初始化的⼀个新的线程,⽽这个线程中初始化的对象则是整个⼯程。

vbnet线程用法 -回复

vbnet线程用法 -回复

vbnet线程用法-回复线程用法介绍:一、什么是线程在计算机科学中,线程是计算机程序执行的最小单元。

它是进程中的一个实体,是CPU调度和分派的基本单位。

线程是进程中的一个实体,是可独立运行的一段程序。

与传统进程不同的是,同一个进程中可以有多个线程同时存在,并且共享进程的内存空间和其他资源。

线程有自己的程序计数器、寄存器和栈,但是没有独立的地址空间。

二、中的线程使用是一种基于.NET框架的编程语言,它提供了多种操作线程的方法和类库,方便我们在应用程序中使用多线程来进行并发处理和提高程序性能。

以下是一些中常用的线程使用方法:1. 创建线程在中,我们可以使用Thread类来创建一个新的线程。

通常情况下,我们会使用匿名函数或者委托来指定要在线程中执行的代码。

以下是一个例子:Dim t As New Thread(Sub()' 线程要执行的代码Console.WriteLine("Hello, World!")End Sub)t.Start() ' 启动线程2. 前台线程和后台线程在线程中,可以将线程设置为前台线程或者后台线程。

前台线程是指在应用程序关闭之前必须执行完毕的线程,而后台线程则是指在应用程序关闭时无论是否执行完毕都会结束的线程。

默认情况下,线程是前台线程,我们可以通过设置Thread类的IsBackground属性来将线程设置为后台线程。

例如:Dim t As New Thread(Sub()' 线程要执行的代码Console.WriteLine("Hello, World!")End Sub)t.IsBackground = True ' 将线程设置为后台线程t.Start() ' 启动线程3. 线程休眠在线程中,我们可以使用Thread类的Sleep方法来暂停当前线程的执行一段时间。

Sleep方法接受一个以毫秒为单位的时间参数,表示要休眠的时间长度。

vb net线程入门详解_跨线程调用窗体控件

vb net线程入门详解_跨线程调用窗体控件

我们想实现这样一个功能:在Label1上面动态显示数字,从0~9000,我们希望看到数字的变化。

创建如下代码:Public Class Form1Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Clicktest()End SubPrivate Sub test()For i = 0 To 9000Label1.Text = i.ToStringNextEnd SubEnd Class意思就是点击按钮,进入test过程中,通过For循环,依次显示数字,真是这样吗?运行试试...不出我意料的话,最后直接显示的是9000,中间还卡了一下。

后面的0都不在了。

那么,我们要显示动态变化又怎么办呢?怎么办呢?把上面的代码修改一下,使用线程。

Imports System.Threading ’导入命名空间Public Class Form1Dim t As Thread ’定义全局线程变量Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles But ton1.Clickt = New Thread(AddressOf test) ’创建线程,使它指向test过程,注意该过程不能带有参数t.Start() ’启动线程End SubPrivate Sub test()For i = 0 To 9000Label1.Text = i.ToStringNextt.Abort()End SubEnd Class再次运行,点击确定,出错啦?什么错?如图:由于是从一个新的线程调用UI线程中窗体控件,所以这个做法很危险,你直接被拒绝了。

有一个解决办法,就是让编译器不进行跨线程检查。

在Load代码第一行加一句:CheckForIllegalCrossThreadCalls = False再次运行程序,就不会有错了,你还能看见动态变化,并且没有“假死”:如上就是线程的好处。

VB.NET下多线程技术的实现

VB.NET下多线程技术的实现

下多线程技术的实现
苏葆光;王渊明
【期刊名称】《梧州学院学报》
【年(卷),期】2005(015)003
【摘要】线程应用分成多个单元执行,在分布式中,实际上使用一个多线程的体系.本文讨论了对多线程的支持,并从线程的创建与维护,线程的优先级,线程的状态,线程池和线程的同步等方面展示了如何使用多线程技术来创建多线程应用程序.由于操作系统要跟踪和确定线程的进度,线程的系统开销会比较大,因此创建新线程必须谨慎.
【总页数】3页(P91-93)
【作者】苏葆光;王渊明
【作者单位】浙江万里学院,基础学院,浙江,宁波,315101;浙江万里学院,基础学院,浙江,宁波,315101
【正文语种】中文
【中图分类】TP31
【相关文献】
1.用多线程技术实现Windows环境下串行通信 [J], 黄经元;吴少爽;陈闽鄂;沈璟
2.Windows 98下利用VC++6.0实现多线程技术的方法 [J], 应珊红
3.多线程技术基于的实现 [J], 欧广宇;邓桂英
4.多线程技术在中的实现 [J], 陈俊伟
5.在Windows2000下用多线程技术实现1394串行总线通信 [J], 赵亚妮;于伦正
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

与多线程通讯文档对应这是一个客户端代码:客户端有两个窗口:Land窗口和FormMain窗口Land窗口为启动窗口Imports Imports .SocketsImports System.TextImports System.Text.EncodingImports System.ThreadingImports System.IOPublic Class LandDim clientstring As ClientStringDim udpClient As New UdpClient(11000)Dim sendBytes As[Byte]()Private dljs As Integer = 0 '登陆计时器Public SocketStream As NetworkStream'用以向网络基础数据流传送数据Private bWriter As BinaryWriter'用以向网络基础数据流获得数据Private bReader As BinaryReaderPrivate swWriter As StreamWriter'用以向网络基础数据流传送数据Dim Client_nsStream As NetworkStream'创建发送数据的网络基础数据流Dim tcpClient As .Sockets.TcpClient'通过它实现向远程主机提出TCP连接申请Private tcpConnect As Boolean = False'定义标识符,用以表示TCP连接是否建立Dim Thread1 As Thread'抓包用的线程Dim Thread2 As ThreadDim Thread3 As Thread'一直循环接收数据Private Delegate Sub voiddelegate(ByVal a As String, ByVal bian As String)Private ji As Integer = 0 '只计数一次Public Sub CloseThread()Thread1.Abort()End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click clientstring = New ClientStringSelect Case Button1.TextCase"登陆"Dim sdd As String = clientstring.Denglu(TextBox1.Text, TextBox2.Text)' MsgBox(sdd)SendString(sdd)Case"关闭"System.Environment.Exit(0)End SelectEnd SubPublic Sub SendString(ByVal sedString As String)bWriter = New BinaryWriter(Client_nsStream)bWriter.Write(sedString)bWriter.Flush()End SubPublic Sub SendString(ByVal sedString As String, ByVal ccnss As NetworkStream)bWriter = New BinaryWriter(ccnss)bWriter.Write(sedString)bWriter.Flush()End SubPrivate Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosingSystem.Environment.Exit(0)End SubPrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadudpClient.JoinMulticastGroup(.IPAddress.Parse("224.224.224.224"))udpClient.Client.ReceiveTimeout = 10000 '表示包的超时期限 0为无限大udpClient.Client.Blocking = False' Socket 将阻止,则为 true;否则为 false。

默认值为 true。

Button1.Enabled = FalseControl.CheckForIllegalCrossThreadCalls = False'窗口最大化Me.MaximizeBox = False'最大化按钮不可用Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog'''''''''' Thread1 = New System.Threading.Thread(AddressOf JianTin)'''''' Thread1.Start()Timer2.Enabled = TrueEnd Sub''' <summary>''' 获取服务器发送来的消息''' </summary>Public Function GetMessage() As StringDim strMsg As String = ""Threading.Thread.Sleep(50)If Client_nsStream Is Nothing ThenReturn"与服务器的连接已断开"End IfbReader = New BinaryReader(Client_nsStream)TrystrMsg = bReader.ReadStringReturn strMsgCatch ex As IOExceptionClient_nsStream = NothingThreading.Thread.Sleep(50)FinallybReader = NothingEnd Try' Timer1.Enabled = TrueCloseThread()Return strMsgEnd Function''' <summary>''' 监听守护线程如果断开就重新连接''' </summary>Public Sub JianChe(ByVal con As TcpClient)Dim strMsg As String = ""Dim ccStream As NetworkStreamDim Cons As New TcpClientCons = conccStream = Cons.GetStream()While TrueThreading.Thread.Sleep(50)If ccStream Is Nothing Then' Return "与服务器的连接已断开"Label3.ForeColor = Color.RedLabel3.Text = "与服务器的连接已断开"' Button1.Text = "关闭"' Timer1.Enabled = TrueButton1.Enabled = FalseThreading.Thread.Sleep(3000)'Thread1 = New System.Threading.Thread(AddressOf JianTin)' Thread1.Start() '如果与服务器连接断开重新启动IP监听线程' Thread2.Abort() '如果与服务器连接断开就关闭线程ElseTry'''在这里加入对数据的处理函数Dim jjss As String = JieShou(ccStream)If jjss = ""Then' MsgBox("与服务器断开")Label3.Text = "与服务器断开"Button1.Enabled = FalseThread2.Abort()ElseDim fg() As Stringfg = Split(jjss, TongxunDingYi._FENGE)Select Case fg(0) '消息头Case TongxunDingYi._DENGLUSelect Case Trim(fg(1))Case"成功"FormMain.Sethuan(TextBox1.Text & " :同学欢迎回来!")Me.Hide()udpClient.Close()FormMain.SetccStream(ccStream)FormMain.ShowDialog()' Thread1 = NewSystem.Threading.Thread(AddressOf ShowForm)' Thread1.Start()Case"失败"MsgBox("用户名或密码错误!")Case"用户在线"MsgBox("用户在线不要重复")End SelectCase TongxunDingYi._TKEnd SelectEnd IfCatch ex As IOExceptionClient_nsStream = NothingThreading.Thread.Sleep(50)FinallybReader = NothingEnd TryEnd If' Return strMsgEnd WhileEnd SubPrivate Sub ShowForm()FormMain.ShowDialog()End Sub''' <summary>''' 抓包得到服务器IP,在没有连接的时候开启连接后关闭''' </summary>Public Sub JianTin()Try' Return "与服务器的连接已断开"' Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)Dim RemoteIpEndPoint As NewIPEndPoint(.IPAddress.Parse("224.224.224.224"), 0)Dim receiveBytes As[Byte]() = udpClient.Receive(RemoteIpEndPoint)Dim returnData As String = ASCII.GetString(receiveBytes)Label3.Text = "接收到: " + returnData.ToString()Label3.ForeColor = Color.Green' Timer1.Enabled = Falsedljs = 0Dim ipRemote As IPAddress'Dim sHostName As StringDim tcpClient As TcpClientipRemote = IPAddress.Parse(returnData.ToString())tcpClient = New Sockets.TcpClient(returnData.ToString(), 11002)'''''MsgBox(tcpClient.Connected) 连接状态'对远程主机的11000端口提出TCP连接申请Client_nsStream = tcpClient.GetStream()'使用获取的网络基础数据流来初始化StreamWriter实例tcpConnect = TrueLabel3.Text = JieShou(Client_nsStream)' Label3.Text = GetMessage()Timer2.Enabled = FalseButton1.Enabled = TrueThread2 = New System.Threading.Thread(AddressOf JianChe)''ArryThread.Add(Thread1)Thread2.Start(tcpClient) ' 启动新线程。

相关文档
最新文档