VB.NET-关闭流之前不发送数据
我试图制作一个程序,在加载时将客户机的屏幕发送到服务器,但直到客户机程序中关闭数据流后,数据才会发送。我知道flush应该发送数据,但是程序中何时有和何时没有flush没有区别 以下是主要服务器代码:VB.NET-关闭流之前不发送数据,vb.net,Vb.net,我试图制作一个程序,在加载时将客户机的屏幕发送到服务器,但直到客户机程序中关闭数据流后,数据才会发送。我知道flush应该发送数据,但是程序中何时有和何时没有flush没有区别 以下是主要服务器代码: Imports System.IO Imports System.Drawing.Imaging Public Class Form1 Dim encodeType As ImageFormat = ImageFormat.Bmp Dim decodingString As Str
Imports System.IO
Imports System.Drawing.Imaging
Public Class Form1
Dim encodeType As ImageFormat = ImageFormat.Bmp
Dim decodingString As String = String.Empty
Dim encodingTypeString = "data:image/bmp;base64"
Public Function base64c(ByVal base64code As String) As Image
Dim imageBytes As Byte() = Convert.FromBase64String(base64code)
Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length)
Return Image.FromStream(ms, True)
End Function
Private Server As TCPControl
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Server = New TCPControl
AddHandler Server.MessageReceived, AddressOf OnLineReceived
End Sub
Private Delegate Sub UpdateDesktopDelegate(Img As PictureBox, base64 As String)
' update image
Private Sub OnLineReceived(sender As TCPControl, Data As String)
Desktop.Image = base64c(Data)
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Server.IsListening = False
End Sub
End Class
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Public Class TCPControl
Public Event MessageReceived(sender As TCPControl, Data As String)
'Config
Public ServerIp As IPAddress = IPAddress.Parse("192.168.254.14")
Public ServerPort As Integer = 64555
Public Server As TcpListener
Private CommThread As Thread
Public IsListening As Boolean = True
'Clients
Private Client As TcpClient
Private ClientData As StreamReader
Public Sub New()
Server = New TcpListener(ServerIp, ServerPort)
Server.Start()
CommThread = New Thread(New ThreadStart(AddressOf Listening))
CommThread.Start()
End Sub
Private Sub Listening()
' create listener loop
Do Until IsListening = False
' accept incoming connections
If Server.Pending = True Then
Client = Server.AcceptTcpClient
ClientData = New StreamReader(Client.GetStream)
End If
' raise event for incoming messages
Try
RaiseEvent MessageReceived(Me, ClientData.ReadLine)
Catch ex As Exception
End Try
Thread.Sleep(300)
Loop
End Sub
End Class
TCPControl服务器代码:
Imports System.IO
Imports System.Drawing.Imaging
Public Class Form1
Dim encodeType As ImageFormat = ImageFormat.Bmp
Dim decodingString As String = String.Empty
Dim encodingTypeString = "data:image/bmp;base64"
Public Function base64c(ByVal base64code As String) As Image
Dim imageBytes As Byte() = Convert.FromBase64String(base64code)
Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length)
Return Image.FromStream(ms, True)
End Function
Private Server As TCPControl
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Server = New TCPControl
AddHandler Server.MessageReceived, AddressOf OnLineReceived
End Sub
Private Delegate Sub UpdateDesktopDelegate(Img As PictureBox, base64 As String)
' update image
Private Sub OnLineReceived(sender As TCPControl, Data As String)
Desktop.Image = base64c(Data)
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Server.IsListening = False
End Sub
End Class
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Public Class TCPControl
Public Event MessageReceived(sender As TCPControl, Data As String)
'Config
Public ServerIp As IPAddress = IPAddress.Parse("192.168.254.14")
Public ServerPort As Integer = 64555
Public Server As TcpListener
Private CommThread As Thread
Public IsListening As Boolean = True
'Clients
Private Client As TcpClient
Private ClientData As StreamReader
Public Sub New()
Server = New TcpListener(ServerIp, ServerPort)
Server.Start()
CommThread = New Thread(New ThreadStart(AddressOf Listening))
CommThread.Start()
End Sub
Private Sub Listening()
' create listener loop
Do Until IsListening = False
' accept incoming connections
If Server.Pending = True Then
Client = Server.AcceptTcpClient
ClientData = New StreamReader(Client.GetStream)
End If
' raise event for incoming messages
Try
RaiseEvent MessageReceived(Me, ClientData.ReadLine)
Catch ex As Exception
End Try
Thread.Sleep(300)
Loop
End Sub
End Class
主要客户端代码:
Imports System.IO
Imports System.Threading
Imports System.Drawing.Imaging
Public Class Form1
Private Client As TCPControl
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Client = New TCPControl("192.168.254.14", 64555)
Do Until False
If Client.Client.Connected = True Then
Dim bounds As Rectangle
Dim screenshot As System.Drawing.Bitmap
Dim newimg As System.Drawing.Bitmap
Dim graph As Graphics
bounds = Screen.PrimaryScreen.Bounds
bounds.Size = New Size(1920, 1080)
screenshot = New System.Drawing.Bitmap(2600, 1330, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(screenshot)
graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
Using ms As New MemoryStream()
newimg = New Bitmap(screenshot, New Size(960, 540))
newimg.Save(ms, ImageFormat.Bmp)
Dim imageBytes As Byte() = ms.ToArray()
Client.Send(Convert.ToBase64String(imageBytes))
End Using
Thread.Sleep(333)
End If
Loop
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If Client.Client.Connected = True Then
Client.DataStream.Close()
Client.Client.Close()
End If
End Sub
End Class
和客户端TCP控制代码:
Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Public Class TCPControl
Public Client As TcpClient
Public DataStream As StreamWriter
Public Sub New(Host As String, Port As Integer)
' client
Client = New TcpClient(Host, Port)
DataStream = New StreamWriter(Client.GetStream)
End Sub
Public Sub Send(Data)
DataStream.Write(Data)
DataStream.Flush()
End Sub
End Class
我已经尝试解决这个问题好几个小时了,在这个网站上发帖是我最后的选择。如果有任何代码是无组织的或不是它应该是的,那是因为我还没有集中精力检查我的代码。你必须从头重写这一个。如果要将Windows窗体用作框架,则不能使用它,因为它是一个控制台应用程序。例如,表单中的
Do-Until-False
。此外,您不需要使用Base64String来发送图像。Client.GetStream()
返回的网络流写入字节。它还具有异步写入支持。在服务器端,请参阅。您不会在闭环中处理创建的位图→ OutOfMemory。如果您没有在适当的时间获得OutOfMemory异常,则其他内容将关闭一个无法启动的窗体。事件和计时器可以是您的朋友。