“我怎样才能倾听?”;控制板“;用印地10号tcpip?

“我怎样才能倾听?”;控制板“;用印地10号tcpip?,tcp,indy10,delphi-10.1-berlin,Tcp,Indy10,Delphi 10.1 Berlin,我有一个Visual Basic代码,它有一个计时器并侦听tcpip流。我试图用deplhi编写代码,但我遇到了问题 我在板上成功地连接到tcpip,如下所示:IdTCPClient1.connect 板tcpip是192.168.0.180,端口2000,我的服务器是192.168.0.30 我正在尝试以下代码: procedure TForm1.Button8Click(Sender: TObject); var StrStream: TMemoryStream; begin if I

我有一个Visual Basic代码,它有一个计时器并侦听tcpip流。我试图用deplhi编写代码,但我遇到了问题

我在板上成功地连接到tcpip,如下所示:IdTCPClient1.connect

板tcpip是192.168.0.180,端口2000,我的服务器是192.168.0.30

我正在尝试以下代码:

procedure TForm1.Button8Click(Sender: TObject);
var StrStream: TMemoryStream;
begin

  if IdTCPClient1.Connected then
    begin
      StrStream := TMemoryStream.Create;
      if IdTCPClient1.IOHandler.Connected then
        IdTCPClient1.IOHandler.ReadStream(StrStream,-1,false);

      Memo1.Lines.Add('hello');
    end;

end;

问题是,在IdTCPClient1.IOHandler.ReadStream(strstrstream,-1,false)行中;应用程序停止,没有错误,没有消息,我不理解

VB代码

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

        Try

            If tcp1.Available > 1 Then
                Dim leitura As NetworkStream = tcp1.GetStream
                Dim bytes(tcp1.ReceiveBufferSize) As Byte
                leitura.Read(bytes, 0, CInt(tcp1.ReceiveBufferSize))
                returndata = Encoding.ASCII.GetString(bytes)
                txtSerial1.AppendText(returndata)

            End If

            If tcp2.Available > 1 Then
                Dim leitura As NetworkStream = tcp2.GetStream
                Dim bytes(tcp2.ReceiveBufferSize) As Byte
                leitura.Read(bytes, 0, CInt(tcp2.ReceiveBufferSize))
                returndata = Encoding.ASCII.GetString(bytes)
                txtSerial2.AppendText(returndata)
            End If


        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

调用IOHandler的
ReadStream()
方法时,设置
AByteCount=-1
AReadUntilDisconnect=False
,告诉
ReadStream()
预期传入数据前面会有一个多字节整数(4或8字节,取决于IOHandler的
LargeStream
属性)它指定数据中随后的字节数,然后等待实际到达的字节数。这就是服务器数据的实际外观吗?我对此表示怀疑,因为这不是您的VB代码所期望的

使用IOHandler的
ReadBytes()
方法和
AByteCount=-1
比使用
ReadStream()
方法更接近于VB代码,例如:

程序TForm1.按钮8单击(发送方:TObject);
变量
字节:TIdBytes;
开始
如果IdTCPClient1.已连接,则
开始
IdTCPClient1.IOHandler.ReadBytes(字节,-1);
//根据需要使用字节。。。
备忘录1.行。添加('hello');
结束;
结束;
另外,请记住Indy默认使用阻塞套接字I/O。您确实不应该在主UI线程中执行阻塞操作。您应该将读取逻辑移到单独的工作线程。或者,至少要确保在
TIdTCPClient
上设置一个小的
ReadTimeout
,这样
ReadBytes()
不会长时间阻塞UI