如何用indy 10 tcpip收听“控制板”?

问题描述 投票:0回答:1

我在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(StrStream,-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
tcp indy10 delphi-10.1-berlin
1个回答
0
投票

[当调用IOHandler的ReadStream()方法时,按如下所示设置AByteCount=-1AReadUntilDisconnect=False会告诉ReadStream()期望传入的数据以多字节整数开头(4或8字节,具体取决于IOHandler的LargeStream属性),它指定数据中后续字节的数量,然后等待实际到达的那个字节。那是服务器数据的实际外观吗?我对此表示怀疑,因为这不是您的VB代码所期望的。

ReadBytes()方法相比,[IO0]与AByteCount=-1一起使用IOHandler的ReadStream()方法更接近于您的VB代码,例如:

procedure TForm1.Button8Click(Sender: TObject);
var
  Bytes: TIdBytes;
begin
  if IdTCPClient1.Connected then
  begin
    IdTCPClient1.IOHandler.ReadBytes(Bytes, -1);
    // use Bytes as needed...
    Memo1.Lines.Add('hello');
  end;
end;

此外,请记住,Indy默认情况下使用阻塞套接字I / O。您实际上不应该在主UI线程中执行阻止操作。您应该将读取逻辑移至单独的工作线程。或者,至少要确保在ReadTimeout上设置一个小的TIdTCPClient,以便ReadBytes()不会长时间阻塞UI。

© www.soinside.com 2019 - 2024. All rights reserved.