Socket的问题,哪位大虾帮忙看一下。

bjhua 2002-08-17 02:41:36
我写了下面的程序,但如果n := s_in.Read(buf[1],bufferSize);正在等待数据,那么
procedure TWorker.sendToServer(msg: String);
begin
msg := msg+ EOL;
s_out.Write(msg[1],Length(msg));
end;
就会也进入等待状态,这是为什么?


unit ClientUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ConstUnit;

type
TWorker = class;
TForm2 = class(TForm)
mMsg: TMemo;
Edit1: TEdit;
btnSend: TButton;
procedure btnSendClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
worker:TWorker;
public
{ Public declarations }
procedure printMessage(msg:string);
end;

TWorker = class(TThread)
private
OutSocket,ClientSocket: TClientSocket;
socket:TCustomWinSocket;
s_in : TWinSocketStream;
s_out:TWinSocketStream;
public
procedure sendToServer(msg:String);
procedure Execute;override;
procedure Test;
constructor Create(createSuspended:boolean);
destructor Destroy;override;
end;
var
Form2: TForm2;

implementation

{$R *.dfm}

{ TWorker }

constructor TWorker.Create(createSuspended: boolean);
begin
ClientSocket := TClientSocket.Create(nil);
ClientSocket.Address := '10.8.6.70';
ClientSocket.Port := 8000;
ClientSocket.ClientType := ctBlocking;
ClientSocket.Active := true;
{
OutSocket := TClientSocket.Create(nil);
outSocket.Address := '10.8.6.70';
OutSocket.Port := 8000;
OutSocket.ClientType := ctBlocking;
OutSocket.Active := true;
}
socket := ClientSocket.socket;
self.FreeOnTerminate := true;
s_in := TWinSocketStream.Create(socket,60000);
s_out := TWinSocketStream.Create(socket,60000);
inherited Create(createSuspended);
end;

destructor TWorker.Destroy;
begin
s_in.Free;
s_out.Free;
ClientSocket.Close;
ClientSocket.Free;
//OutSocket.Close;
//OutSocket.Free;
end;

procedure TWorker.Execute;
var
buf,msg:string;
n:integer;
begin
//inherited;
//Form2.PrintMessage('Start Listening from server');
sendToServer('I have connected to u');
while socket.Connected do
begin
msg := '';
repeat
buf := '';
SetLength(buf,bufferSize);
n := s_in.Read(buf[1],bufferSize);
form2.printMessage('read bytes='+IntToStr(n));
if n = 0 then break;
SetLength(buf,n);
//form2.printMessage('+++++++++++++buf is '+buf);
msg := msg + buf;
until(Pos(EOL,buf)>0);

if msg <> '' then form2.printMessage('=========='+msg);
form2.printMessage('.........IDLE');
self.sendToServer('test');
//sleep(1300);
end;
end;

procedure TWorker.sendToServer(msg: String);
begin
msg := msg+ EOL;
s_out.Write(msg[1],Length(msg));
end;

procedure TWorker.Test;
begin
form2.printMessage('TWorker::Test');
end;

{ TForm2 }

procedure TForm2.printMessage(msg: string);
begin
mMsg.Lines.Add(msg);
end;

procedure TForm2.btnSendClick(Sender: TObject);
begin
worker.sendToServer(Edit1.Text);
//worker.Test;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
test:string;
begin
worker := TWorker.Create(False);
//worker.sendToServer(test);
//worker.Resume;
end;

end.
...全文
20 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧