前端時間一直在搞VB.net里面的socket通訊。
或是說是在VB.net實作socket通訊
一些人也許知道,socket這個概念最早是UNIX里面的。 用于實作TCP/IP協議族里面的通訊。
后來被各家公司抄了過去,比如微軟 Sun之類的。 目前很多語言里面 ,都是使用socket實作TCP/IP通訊的。或者說大都有socket這么個東西。
三張圖:



特別是第三步 ,很很多人都是死這里的
源代碼地址
https://download.csdn.net/download/weixin_42822828/10699552
uj5u.com熱心網友回復:
服務器 代碼
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Public Class Form1
Private Class CSState
Public myTcpListener As TcpListener
Public ClientSocket As Socket
Public mystring As String
End Class
Private myDatatable As New DataTable
Private myTcpListener As TcpListener
Delegate Sub SetMsgCallBack(ByVal state As Object)
Private Sub DisplayMsg1(ByVal state As Object)
Dim myObj As New CSState
myObj = CType(state, CSState)
If Me.DataGridView1.InvokeRequired Then
Dim d As New SetMsgCallBack(AddressOf DisplayMsg1)
Me.Invoke(d, New Object() {myObj})
Else
Dim xRow As DataRow = myDatatable.NewRow()
xRow.Item(0) = CType(myObj.ClientSocket.RemoteEndPoint, IPEndPoint).Address.ToString()
xRow.Item(1) = CType(myObj.ClientSocket.RemoteEndPoint, IPEndPoint).Port.ToString()
xRow.Item(2) = myObj.mystring
myDatatable.Rows.Add(xRow)
End If
End Sub
Delegate Sub LbCallBack(ByVal myString As String, ByVal myColor As Color)
Private Sub ChangeLB(ByVal myString As String, ByVal myColor As Color)
If Me.Label2.InvokeRequired Then
Dim d As New LbCallBack(AddressOf ChangeLB)
Me.Invoke(d, New Object() {myString, myColor})
Else
Label2.Text = myString
Label2.ForeColor = myColor
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myDatatable.Columns.Add("IP")
myDatatable.Columns.Add("Port")
myDatatable.Columns.Add("Data")
DataGridView1.DataSource = myDatatable
DataGridView1.Columns(2).Width = 150
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Button1.Enabled = True Then
Dim iPort As Integer
iPort = NumericUpDown1.Value
Button1.Enabled = False
Button2.Enabled = True
Dim ListenThread As New Thread(AddressOf StartListen)
ListenThread.IsBackground = True
ListenThread.Start(iPort)
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Button2.Enabled = True Then
myTcpListener.Stop()
ChangeLB("TCP Listener 停止", Color.Red)
Button1.Enabled = True
Button2.Enabled = False
End If
End Sub
Private Sub StartListen(ByVal state As Object)
Dim iPort As Integer
iPort = CType(state, Integer)
myTcpListener = New TcpListener(IPAddress.Any, iPort)
Try
Dim ClientSocket As Socket
myTcpListener.Start()
Dim iCount As Integer = 0
ChangeLB("TCP Listener 已啟動", Color.Blue)
Do
ClientSocket = myTcpListener.AcceptSocket()
If ClientSocket.Connected = True Then
Dim myObj As New CSState
myObj.myTcpListener = myTcpListener
myObj.ClientSocket = ClientSocket
myObj.mystring = Now.ToString("yyyy/MM/dd HH:mm:ss") & "已連線"
DisplayMsg1(myObj)
Dim ReceiveThread As New Thread(AddressOf ReceiveData)
ReceiveThread.IsBackground = True
ReceiveThread.Start(myObj)
iCount += 1
End If
Loop
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
Private Sub ReceiveData(ByVal state As Object)
Dim myObj As New CSState
myObj.ClientSocket = CType(state, CSState).ClientSocket
myObj.myTcpListener = CType(state, CSState).myTcpListener
myObj.mystring = ""
Dim myNetworkStream As New NetworkStream(myObj.ClientSocket)
Dim InBytesCount As Integer = 0
Dim myReceiveBytes(1023) As Byte
Dim i As Integer = 0
While True
Try
InBytesCount = myNetworkStream.Read(myReceiveBytes, 0, myReceiveBytes.Length)
System.Threading.Thread.Sleep(100)
If InBytesCount = 0 Then
Exit While
End If
myObj.mystring = Encoding.GetEncoding(950).GetString(myReceiveBytes).TrimEnd().TrimStart()
DisplayMsg1(myObj)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Exit Sub
End Try
End While
End Sub
End Class
uj5u.com熱心網友回復:
客戶端代碼
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Form1
Private myTcpClient As TcpClient
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Enabled = True
Button2.Enabled = False
Button3.Enabled = False
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Enabled = False
Dim myIPEndPoint As New IPEndPoint(IPAddress.Any, 0)
myTcpClient = New TcpClient(myIPEndPoint)
Dim ServerIpAddress As IPAddress
Try
ServerIpAddress = IPAddress.Parse(TextBox1.Text)
Catch ex As Exception
MessageBox.Show("Server IP設定錯誤")
Exit Sub
End Try
Dim iPort As Integer
iPort = NumericUpDown1.Value
Dim RemoteIpEndPoint As New IPEndPoint(ServerIpAddress, iPort)
Try
myTcpClient.Connect(RemoteIpEndPoint)
Do
If myTcpClient.Connected = True Then
Label4.Text = "連線中"
Button1.Enabled = False
Button2.Enabled = True
Button3.Enabled = True
Exit Do
End If
Loop
Catch ex As Exception
MessageBox.Show(ex.ToString)
Label4.Text = "未連線"
Button1.Enabled = True
Button2.Enabled = False
Button3.Enabled = False
End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim ServerIpAddress As IPAddress
Try
ServerIpAddress = IPAddress.Parse(TextBox1.Text)
Catch ex As Exception
MessageBox.Show("Server IP設定錯誤")
Exit Sub
End Try
Dim iPort As Integer
iPort = NumericUpDown1.Value
Dim RemoteIpEndPoint As New IPEndPoint(ServerIpAddress, iPort)
Dim myNetworkStream As NetworkStream
Dim myBytes As Byte()
myBytes = Encoding.GetEncoding(950).GetBytes(Trim(TextBox2.Text).TrimEnd())
Try
myNetworkStream = myTcpClient.GetStream()
myNetworkStream.Write(myBytes, 0, myBytes.Length)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
myTcpClient.Close()
Label4.Text = "未連線"
Button1.Enabled = True
Button2.Enabled = False
Button3.Enabled = False
End Sub
End Class
uj5u.com熱心網友回復:
骨骼精奇啊這客戶的發送代碼和常規的不一樣啊
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim ServerIpAddress As IPAddress
Try
ServerIpAddress = IPAddress.Parse(TextBox1.Text)
Catch ex As Exception
MessageBox.Show("Server IP設定錯誤")
Exit Sub
End Try
Dim iPort As Integer
iPort = NumericUpDown1.Value
Dim RemoteIpEndPoint As New IPEndPoint(ServerIpAddress, iPort)
Dim myNetworkStream As NetworkStream
Dim myBytes As Byte()
myBytes = Encoding.GetEncoding(950).GetBytes(Trim(TextBox2.Text).TrimEnd())
Try
myNetworkStream = myTcpClient.GetStream()
myNetworkStream.Write(myBytes, 0, myBytes.Length)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
××××××××××
NetworkStream類提供了用于通過發送和接收資料的方法Stream處于阻止模式套接字。
啥意思
機器翻譯過來的就是不太清晰明了
×××××××××××
若要創建NetworkStream,則必須提供連接Socket。使用Write和Read方法用于簡單的單執行緒同步阻塞 I/O。
如果你想要處理 I/O 使用單獨的執行緒,請考慮使用BeginWrite并EndWrite方法,或BeginRead和EndRead方法進行通信
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.networkstream?redirectedfrom=MSDN&view=netframework-4.7.2
之前在記憶體映射里面,看到過流這個概念。 原來網路通訊里面 也有流這個概念
uj5u.com熱心網友回復:
學習了.樓主辛苦了uj5u.com熱心網友回復:
要cB的。cbcbcbcbuj5u.com熱心網友回復:
萌新向大佬學習uj5u.com熱心網友回復:
已下載學習,寫的很不錯,解決了長期的困擾uj5u.com熱心網友回復:
萌新來學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/102055.html
標籤:VB.NET
