用 vb.net socket通信
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供汕尾網(wǎng)站建設(shè)、汕尾做網(wǎng)站、汕尾網(wǎng)站設(shè)計、汕尾網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、汕尾企業(yè)網(wǎng)站模板建站服務,十余年汕尾做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
Dim th As Threading.Thread
2 Dim tcpl As System.Net.Sockets.TcpListener
3
4 Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
5 th = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf MyListen))
6 th.Start()
7 End Sub
8
9 Public Sub SendMessage()Sub SendMessage(ByVal IP As String, ByVal SendMsg As String)
10 Try
11 If IP "" Then
12 Dim tcpc As New System.Net.Sockets.TcpClient(IP, 5656)
13 Dim tcpStream As Net.Sockets.NetworkStream = tcpc.GetStream
14 Dim reqStream As New IO.StreamWriter(tcpStream)
15 reqStream.Write(SendMsg)
16 reqStream.Flush()
17 tcpStream.Close()
18 tcpc.Close()
19 End If
20 Catch ex As Exception
21 MsgBox(ex.Message.ToString)
22 End Try
23 End Sub
24 Private Sub MyListen()Sub MyListen()
25 Try
26 Dim ipAddress As System.Net.IPAddress = System.Net.Dns.Resolve(System.Net.Dns.GetHostName).AddressList(0)
27 tcpl = New System.Net.Sockets.TcpListener(ipAddress, 5656)
28 tcpl.Start()
29 While True
30 Dim s As System.Net.Sockets.Socket = tcpl.AcceptSocket()
31 Dim MyBuffer(1024) As Byte
32 Dim i As Integer
33 i = s.Receive(MyBuffer)
34 If i 0 Then
35 Dim lstrRec As String
36 Dim j As Integer
37 For j = 0 To i - 1
38 TextBox1.Text += Chr(MyBuffer(j)) ","
39 Next
40 End If
41 End While
42 Catch ex As Exception
43 MsgBox(ex.Message.ToString)
44 End Try
45 End Sub
46
47 Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
48 SendMessage("192.168.0.61", TextBox2.Text)
49 End Sub
關(guān)于串口通訊的問題:
很明顯,你還不知道(不會、不習慣)使用事件驅(qū)動的方式接收數(shù)據(jù)。
建議你仔細看看串口組件(無論VB6還是VB.net)的OnComm事件,你的問題很容易解決。
關(guān)于以太網(wǎng)通訊:
在TCP通訊中端口確實可以重用,你百度一下“TCP端口重用”能查到很多示例。
但絕大多數(shù)情況下不推薦端口重用,而應該采取服務器端建立連接池的方法。
或者,干脆不用TCP,用UDP解決也可以。
新窗體中寫
構(gòu)造函數(shù)
,然后調(diào)用。
比如你要調(diào)用的新窗體是From1.cs這個窗體,
public
Form1(要傳入的參數(shù))
{
//把傳入的參數(shù)傳入窗體中
//執(zhí)行窗體標準內(nèi)容
}
然后在需要調(diào)用的地方調(diào)用
Form1
f
=
new
Form1(傳出的參數(shù));
'--------Form1--------
Dim
f2
As
Form2
Private
Sub
Command1_Click()
Set
f2
=
New
Form2
f2.Show
vbModal
End
Sub
'--------Form1
End--------
'--------Form2--------
Dim
WithEvents
f3
As
Form3
Private
Sub
Command1_Click()
Set
f3
=
New
Form3
f3.Show
End
Sub
Public
Sub
f3_f2W()
Me.Command1.Caption
=
"f2W"
End
Sub
'--------Form2
End--------
'--------Form3--------
Public
Event
f2W()
Private
Sub
Command1_Click()
RaiseEvent
f2W
End
Sub
'--------Form3
End--------
f.Show();
如此就能實現(xiàn)調(diào)用了。
用form的ShowDialog這個功能,這個是可以進行窗體間的傳值的。
比如在父窗體上需要傳的值是textbox1的內(nèi)容,子窗體是childform.
那么在父窗體上的點擊事件中可以這樣寫
dim frm as childform = New childform
'要在子窗體上的textbox1里顯示父窗體中的textbox1中的內(nèi)容,這樣寫
frm.textbox1.text = me.textbox1.text
'最后
frm.showdialog()
這樣就可以了。
如果說你三個窗體完全一樣,那你也不用寫三個一樣的窗體只要寫一個就行了,在不同的按鈕事件中做不同的賦值即可。
不過這樣打開的子窗體是模態(tài)窗體,也就是說在子窗體顯示之后,要對父窗體進行操作必需關(guān)閉子窗體才行。
在編寫VB.Net windows應用程序的時候我們經(jīng)常會遇到這種問題,怎么樣在兩個窗體間傳遞數(shù)據(jù)呢?例如,用VB.Net做一個文本編輯器,里面有一個搜索功能(即搜索我打開的文本里面的文字),點搜索則彈出搜索對話框,輸入要搜索的內(nèi)容,然后確定,就可以搜索到我打開的文本里面的文字了,這里就用到了兩個窗體間的相互通信。我查看了相關(guān)的資料想了想,得出一些想法和方法。
也許有的人會覺得這個很簡單呀。假如主框架為Form1,打開的搜索對話框是Form2.直接在Form2類中申明一個Form1實例:dim f1 as new Form1然后就可以通過f1來調(diào)用Form1中的域和函數(shù)了。其實不是這樣的,你申明的新的Form1實例不是原來的那個Form1對象了,這樣操作的是新的Form1中的域和函數(shù),和最先打開的Form1是沒有關(guān)系的。
那應該如何來完成兩個窗體的通訊呢?我們要做的是把當前的Form1實例傳遞給Form2,如果是這樣的話,問題就很好解決了。
方法1:首先,我們在Form2中定義:
Private mF_Form As Form1
我們更改Form2的構(gòu)造函數(shù)為有參數(shù)的
Public Sub New(ByVal form As Form1)
MyBase.New()
'該調(diào)用是 Windows 窗體設(shè)計器所必需的。
InitializeComponent()
Me.mF_Form = form
'在 InitializeComponent() 調(diào)用之后添加任何初始化
End Sub
在Form1中,我在 要用到Form2的地方申明如下:
Dim f1 As New Form2(Me)
這里的me指的就是Form1當前的實例,也就是把當前Form1的實例通過Form2的構(gòu)造函數(shù)傳遞給Form2類(其實在網(wǎng)上看到過比較蠢的方式,就是在構(gòu)造函數(shù)里面?zhèn)鬟f要傳遞的信息如:字符串或是數(shù)字等,這樣做很有局限性,不能傳遞其他的,所有我們可以直接傳遞實例,來完成傳遞更多的信息。)
這樣在Form2中使用myForm 就可以對原來的Form1窗口進行操作了。但是你要把要操作的Form1中的域和函數(shù)定義成public形式的(這樣可能不安全),此時的myForm就是真正的最開始打開的Form1了,你可以用這個實例來進行兩個窗體的通訊了。
方法2:其實VB.Net中提供了窗體間進行通訊的現(xiàn)成的屬性,呵呵,我們能想到的,微軟也想到了,他們創(chuàng)造的語言其實確實可以說是人性化了。
在Form1類中申明Form2時用如下代碼:
Dim f2As New Form2 '類Form2中的構(gòu)造函數(shù)不改,還是無參的
f2.owner=me
也可以使用函數(shù)的方法,給當前實例添加一個附屬窗口 代碼:Me.AddOwnedForm(f2)
在Form2類的定義中寫如下代碼:
dim f1 as Form1=me.owner
這樣f1對應的就是原來的Form1的實例了,也就可以用這個進行通訊了。但是還是要把不同類之間訪問的域和函數(shù)定義成public,哎,安全確實是一個問題?。?/p>
利用全局變量
利用控件屬性
在vb.net中兩個窗體間的變量可以相互引用了
例如:可以這樣用
Public Class Form1
Public asd As Integer
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
? asd = 123
End Sub
End Class
Public Class Form2
Private Sub Form2_Click(sender As Object, e As System.EventArgs) Handles Me.Click
? TextBox1.Text = Form1.asd
End Sub
End Class