Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET-关闭流之前不发送数据_Vb.net - Fatal编程技术网

VB.NET-关闭流之前不发送数据

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

我试图制作一个程序,在加载时将客户机的屏幕发送到服务器,但直到客户机程序中关闭数据流后,数据才会发送。我知道flush应该发送数据,但是程序中何时有和何时没有flush没有区别

以下是主要服务器代码:

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异常,则其他内容将关闭一个无法启动的窗体。事件和计时器可以是您的朋友。