/////////////////////////////////////////////////////////////
//本程序是控制台下面的serversocket组件,用于监听本机701端口
// 问题:socket接收不对数据??????????????????????????????
//////////////////////////////////////////////////////////////
program Myserver;{$APPTYPE CONSOLE} uses 
  SysUtils,ScktComp,windows;type
  TEvents = class 
  public 
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); 
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
    procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); 
  end; var
  Events : TEvents;
  input: String;
  Client: TServerSocket;
  
{------------------------------------------------------------------------------}
procedure Screate;stdcall;
begin
        Events := TEvents.Create;
        Client := TserverSocket.Create(nil);
        Client.serverType := stNonBlocking;
        Client.OnClientError := Events.ClientError;
        Client.OnClientRead := Events.ClientRead;
end;procedure listen();
begin
if Client = nil then
 begin
        Events := TEvents.Create;
        Client := TserverSocket.Create(nil);
        Client.serverType := stNonBlocking;
        Client.OnClientDisconnect := Events.ClientDisconnect;
        Client.OnClientError := Events.ClientError;
        Client.OnClientRead := Events.ClientRead;
end;Client.Port := 701;
if Client.Active = false then
begin
 writeln('begin listing...');
 Client.Active := true;
end
else
 writeln('already listened');
end; 
procedure sendout(data: String); 
begin 
try 
    begin
       Client.Socket.SendText(data +#13+#10);
    end;
    except
       writeln('cannot send to host...');
    end;
end;  
{------------------------------------------------------------------------------} procedure TEvents.ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; 
  var ErrorCode: Integer); 
begin 
//OnError 
  messagebox (0,'发送错误','报告',mb_ok);
  writeln('Error Code: ' + inttostr(ErrorCode));
end; procedure TEvents.ClientRead(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  incoming: String; 
begin 
//OnRead 
messagebox (0,'收到消息','报告',mb_ok);
incoming := Socket.ReceiveText; 
writeln(incoming);
end; {------------------------------------------------------------------------------}
{main code here}
begin
writeln('    ServerSocket组件监听器 ');
writeln('监听本机端口701 ');
writeln('********************************');
writeln('命令:');
writeln('   l listen     开始监听');
writeln('   d disconnect 断开连接');
writeln('    .           发送文本');
writeln('   q quit       退出程序');
writeln('********************************');
Screate;
{catch commands}
while (lowercase(input) <> 'quit') do
        begin
        write('命令:');
        readln(input);
        if input='' then continue;
        if (lowercase(Copy(input,1,1)) = 'q') then
                begin
                writeln('good bye'); 
                end
        else
        if (lowercase(Copy(input,1,1)) = 'l') then
                begin 
                listen;
                end         else 
        if (lowercase(copy(input,1,1)) = 'd') then
                begin 
                disconnect; 
                end        else 
        if (Copy(input,1,1) = '.') then 
                begin 
                if Copy(input,2,length(input)-1) <> '' then 
                        begin 
                        sendout(Copy(input,2,length(input)-1));
                        end
                        else
                                begin 
                                writeln('Syntax: .<text>'); 
                                end;
                end         else 
                begin 
                writeln('not a command'); 
                end;         end; 
end.

解决方案 »

  1.   

    Client.Socket.SendText(data +#13+#10);
    看着好奇怪阿,你不是定义Client: TServerSocket;嘛?应该是在收到connect后做这种事阿procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Socket.SendText('');
    end;
      

  2.   

    就算要在外面写也要这样写阿
      ServerSocket1.Socket.Connections[i].SendText否则怎么发给谁阿
      

  3.   

    忘了你把Server命名为Client了
    应该是
    procedure TForm1.ClientClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Socket.SendText('');
      //或
      Client.Socket.Connections[i].SendText('');
    end;
      

  4.   

    非常感谢 alfsnow(丰子)的解答!
    对不起,我不知道怎么送分给你,也不知道你收到了没有?本人有个疑问:
    Client.Socket.Connections[i].SendText('');
    参数i我应该怎么设置?
    特别是当多个客户端了连接的时候,怎么用参数i确定当前请求的客户端?