Delphi中的ClientSocket错误

马特·奥尔森

嗨,我对以下代码有疑问:

program client;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Win.ScktComp, idContext, idGlobal;

var
  ClientSocket1: TClientSocket;
  m: TMethod;
  m2: TMethod;

procedure hi(Sender: TObject; Socket: TCustomWinSocket);
begin
  ClientSocket1.Socket.SendText('hello');
  Writeln('connect');
end;

Procedure read_data(Sender: TObject; Socket: TCustomWinSocket);
Var
  Raw: String;
Begin
  Raw := Socket.ReceiveText;
  Writeln(Raw);
End;

begin
  try

    ClientSocket1 := TClientSocket.Create(nil);
    ClientSocket1.Address := '127.0.0.1';
    ClientSocket1.Port := 123;
    ClientSocket1.Open;

    m.Code := @read_data;
    m.Data := ClientSocket1;
    ClientSocket1.OnRead := TSocketNotifyEvent(m);

    m2.Code := @hi;
    m2.Data := ClientSocket1;
    ClientSocket1.OnConnect := TSocketNotifyEvent(m2);

    while '1' = '1' do
    begin
      //
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

问题是没有从服务器接收任何信息,并且在程序中未正确连接时。该程序是一个使用ClientSocket组件进行连接的控制台应用程序。

服务器程序在图形应用程序中运行,并使用启用了ServerSocket组件的端口123,请使用以下按钮:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.Socket.Connections[ListBox1.Itemindex].SendText(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  lugar: Integer;
begin
  ListBox1.Clear;
  for lugar := 0 To ServerSocket1.Socket.ActiveConnections - 1 do
  begin
    ListBox1.Items.add(ServerSocket1.Socket.Connections[lugar].RemoteHost);
  end;
end;

有人能帮我吗?

雷米·勒博

默认情况下,TClientSocket以非阻塞模式运行。在这种模式下,它在内部使用窗口消息来触发其事件。但是您的代码中没有消息循环,因此您需要添加一个。同样,您也没有正确设置事件处理程序(Self因为您的处理程序不是类的成员,因此您缺少显式参数)。

试试这个:

program client;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Win.ScktComp, Winapi.Windows;

procedure socket_connected(Self: Pointer; Sender: TObject; Socket: TCustomWinSocket);
begin
  Writeln('connect');
  Socket.SendText('hello');
end;

procedure socket_disconnected(Self: Pointer; Sender: TObject; Socket: TCustomWinSocket);
begin
  Writeln('disconnect');
  PostQuitMessage(0);
end;

procedure socket_read(Self: Pointer; Sender: TObject; Socket: TCustomWinSocket);
var
  Raw: String;
begin
  Raw := Socket.ReceiveText;
  Writeln(Raw);
end;

procedure socket_error(Self: Pointer; Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  Writeln('error');
  PostQuitMessage(0);
end;

var
  ClientSocket1: TClientSocket;
  m: TMethod;
  msg: TMsg;
begin
  try
    ClientSocket1 := TClientSocket.Create(nil);
    try
        ClientSocket1.Address := '127.0.0.1';
        ClientSocket1.Port := 123;

        m.Code := @socket_connected;
        m.Data := ClientSocket1;
        ClientSocket1.OnConnect := TSocketNotifyEvent(m);

        m.Code := @socket_disconnected;
        m.Data := ClientSocket1;
        ClientSocket1.OnDisconnect := TSocketNotifyEvent(m);

        m.Code := @socket_read;
        m.Data := ClientSocket1;
        ClientSocket1.OnRead := TSocketNotifyEvent(m);

        m.Code := @socket_error;
        m.Data := ClientSocket1;
        ClientSocket1.OnError := TSocketErrorEvent(m);

        ClientSocket1.Open;

        while GetMessage(msg, 0, 0, 0) do
        begin
          TranslateMessage(msg);
          DispatchMessage(msg);
        end;
      finally
        ClientSocket1.Free;
      end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;    
end.

否则,请将套接字改为阻塞模式,并完全摆脱事件处理程序:

program client;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Win.ScktComp;

var
  ClientSocket1: TClientSocket;
  Raw: String;
begin
  try
    ClientSocket1 := TClientSocket.Create(nil);
    try
        ClientSocket1.Address := '127.0.0.1';
        ClientSocket1.Port := 123;
        ClientSocket1.ClientType := ctBlocking;

        try
          ClientSocket1.Open;
          Writeln('connect');
          ClientSocket1.Socket.SendText('hello');
          repeat
            Raw := ClientSocket1.Socket.ReceiveText;
            if Raw <> '' then Writeln(Raw);
          until not ClientSocket1.Connected;
          Writeln('disconnect');
        except    
          Writeln('error');
          raise;
        end;
      finally
        ClientSocket1.Free;
      end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;    
end.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Delphi中的CreateVertexDeclaration错误

来自分类Dev

Delphi中的CreateVertexDeclaration错误

来自分类Dev

Delphi中的错误重载过程

来自分类Dev

Delphi中的错误重载过程

来自分类Dev

delphi中的堆栈溢出错误

来自分类Dev

Delphi XE2中的“ uses”错误

来自分类Dev

Delphi中的不兼容类型错误

来自分类Dev

调用Web服务并在Delphi 7中返回错误

来自分类Dev

在Delphi中,在THeadercontrol上调用FlipChildren引发错误

来自分类Dev

在Delphi中找不到陷阱ADO Provider的错误

来自分类Dev

在Delphi XE5中文件日期返回错误

来自分类Dev

透明光标在Delphi中显示错误的颜色

来自分类Dev

Delphi中获取sqlite3.dll找不到错误

来自分类Dev

delphi中的错误字符串变量

来自分类Dev

如何在Delphi中解决这个简单的错误

来自分类Dev

在Delphi中找不到陷阱ADO Provider的错误

来自分类Dev

在Delphi中,在THeadercontrol上调用FlipChildren引发错误

来自分类Dev

Delphi XE4中的编译错误

来自分类Dev

在Delphi XE5中文件日期返回错误

来自分类Dev

ListBoxItem Delphi XE5中的项目顺序错误

来自分类Dev

ADO查询中的Delphi 7语法错误(逗号)

来自分类Dev

Delphi XE中的数字超出范围错误

来自分类Dev

在Delphi中表单位置计算中的错误

来自分类Dev

IDE 中的 Delphi int64 溢出错误

来自分类Dev

代码Socket clientSocket = new Socket(); 在Android应用程序中崩溃。为什么?

来自分类Dev

Delphi-TWebBrowser中的证书错误,IE9中没有错误

来自分类Dev

Delphi-TWebBrowser中的证书错误,IE9中没有错误

来自分类Dev

Java DatagramSocket,Dart ClientSocket

来自分类Dev

Delphi属性stackoverflow错误