【问题标题】:Send and Receive text using sockets in Delphi 2010在 Delphi 2010 中使用套接字发送和接收文本
【发布时间】:2013-06-10 02:17:48
【问题描述】:

我对 Delphi 2010 不太熟悉,并且在使用组件 ClientSocket 和 ServerSocket 时遇到了麻烦。问题很简单:我正在尝试使用以下代码将文本从客户端发送到服务器:

cliente.Socket.SendText('call');

在服务器端我写了如下代码:

procedure TForm6.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
s: string;
begin
s:=Socket.ReceiveText;
if s = 'call' then
begin
showmessage('Client is Calling');
end;
end;

但是,服务器不显示消息。能再帮我一次吗?

【问题讨论】:

    标签: delphi delphi-2010


    【解决方案1】:

    在 D2009+ 中,SendText()ReceiveText() 无法正确处理 Unicode 字符串。最好直接使用SendBuf()ReceiveBuf()

    话虽如此,TClientSocketTServerSocket 已被弃用很长时间。您应该使用不同的组件集,例如 Indy(也随 Delphi 提供),例如:

    IdTCPClient1.IOHandler.WriteLn('call');
    

    procedure TForm6.IdTCPServer1Execute(AContext: TIdContext);
    var
      s: string;
    begin
      s := AContext.Connection.IOHandler.ReadLn;
      if s = 'call' then
      begin
        // TIdTCPServer is a multi-threaded component,
        // but ShowMessage() is not thread-safe...
        Windows.MessageBox(0, 'Client is Calling', '', MB_OK);
      end;
    end;
    

    【讨论】:

    • 确实,sockets 被弃用很久了,但我不知道如何使用另一个组件来达到相同的结果,但现在我知道了。谢谢。
    • 无论如何,对于那些仍在 Delphi 2010 中使用 soket 的人来说,一个函数可以响应最初的问题:function ReturnStringReceive(Socket: TCustomWinSocket): String; Var Res: AnsiString; Begin SetLength(res, Socket.ReceiveBuf(Pointer(nil)^, -1)); SetLength(res, Socket.ReceiveBuf(Pointer(res)^, Length(res))); Result := String(res); End; 并调用:procedure TForm9.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin label1.caption := ReturnStringReceive(Socket); end;
    • @V.Salles:这不是一个真正的解决方案,因为它没有考虑消息边界。想象一下,如果您在调用ReturnStringReceive() 之前多次调用SendText() 会发生什么情况。 ReceiveBuf(nil, -1)(与ReceiveLength() 相同)可能会返回一个包含来自多个SendText() 的数据的值。
    • @V.Salles:正确的处理方法是:1)在每个字符串的前面加上它的长度,所以接收器可以先读取长度,然后再读取数据,或者 2) 使用在字符串数据中找不到的唯一标识符来分隔消息,因此接收方可以继续阅读,直到找到分隔符。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2016-02-21
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多