“我怎样才能倾听?”;控制板“;用印地10号tcpip?
我有一个Visual Basic代码,它有一个计时器并侦听tcpip流。我试图用deplhi编写代码,但我遇到了问题 我在板上成功地连接到tcpip,如下所示:IdTCPClient1.connect 板tcpip是192.168.0.180,端口2000,我的服务器是192.168.0.30 我正在尝试以下代码:“我怎样才能倾听?”;控制板“;用印地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
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