关于TClientSocket和TServerSocket的问题,请大家帮忙。 ( 积分: 100 )

  • 主题发起人 主题发起人 vinge
  • 开始时间 开始时间
V

vinge

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一个程序,在程序刚启动时涉及到通信(向服务端索取一个字符串),因刚接触到socket方面,在网上找资料,做了一个极其简单的Client-Server通信。(在Client的OnConnect里sendText('1'),在OnRead里获取Socket.ReceiveText;成功)
后来发现, 在获取服务器字符串时主程序依然继续执行。我想让主程序必须在获取字符串后才继续执行,否则退出程序,请问大家怎么做?最好有简单的代码示例。
谢谢。
 
具体意思不明白!?
通信程序分为客户端、服务器端,服务器端是一直打开的
否则,客户端连接不上,什么也做不了
如果要实现你要的结果,可以做如下处理:
Server.OnRead()
begin
//说明已经读到信息
if(获得一种条件)then
begin
//do something
end
else
begin
exit;//退出
end;
end;
 
使用一个循环然后加一个超时设置就可以了!
while true do
begin
if 超时 then ...;
if 返回 then ...;
end;
 
主程序的窗体显示之前或都是你的程序在初始化状态时取到字符,否则就不继续执行主程序就可以了,关闭退出
 
同意楼上,还有超时判断
参考帮助
 
对不起没说明白。补充一下:
就是程序中有个全局变量:StrServerReturn;
在程序刚运行时去连接服务器,获取一个字符串赋给StrServerReturn;(获取过程中,主程序是不继续执行的,直到StrServerReturn被赋值了,主程序才继续执行下一步——检查StrServerReturn的值是否与另一个值相同)
 
代码极其简单,如下:
客户端:
//出错
procedure TfrmMain.myClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Application.MessageBox(PChar('不能连接到服务端,可能是监听程序没有运行或网络故障!'),'连接错误',MB_OK+MB_ICONSTOP);
ErrorCode := 0;
end;
//请求
procedure TfrmMain.myClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText('1');
end;
//获取
procedure TfrmMain.myClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
StrServerReturn := Socket.ReceiveText;
end;
//主窗口
procedure TfrmMain.FormCreate(Sender: TObject);
begin
myClientSocket.Address := '192.168.100.15';//strServerIP;
myClientSocket.Port := 8899;
myClientSocket.Open;

showmessage(StrServerReturn);//这时是个空值
end;

服务端:
procedure TfrmService.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i: integer;
begin
i := Socket.SendText('服务器返回的字符串');
end;

procedure TfrmService.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;
 
//初始化代码
//向服务端发送数据
//下面为停留判断是否返回值赋给StrServerReturn
while true do
begin
if 超时 then ....;
if StrServerReturn = '某个值' then beake;
end;
 
var
TimeOut: integer;
StrServerReturn: String;
客户端:
//出错
procedure TfrmMain.myClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Application.MessageBox(PChar('不能连接到服务端,可能是监听程序没有运行或网络故障!'),'连接错误',MB_OK+MB_ICONSTOP);
ErrorCode := 0;
end;
//请求
procedure TfrmMain.myClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText('1');
end;
//获取
procedure TfrmMain.myClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
StrServerReturn := Socket.ReceiveText;
end;
//主窗口
procedure TfrmMain.FormCreate(Sender: TObject);
begin
myClientSocket.Address := '192.168.100.15';//strServerIP;
myClientSocket.Port := 8899;
myClientSocket.Open;

showmessage(StrServerReturn);//这时是个空值
end;

服务端:
procedure TfrmService.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i: integer;
begin
i := Socket.SendText('服务器返回的字符串');
end;

procedure TfrmService.FormCreate(Sender: TObject);
var
vStartTime: integer;
begin
ServerSocket1.Open;
TimeOut := 6000; {超时时间设置, 这个可以自己定}
vStartTime := GetTickCount;
while true do
begin
if GetTickCount - vStartTime >= TimeOut then
begin
{超时处理}
end;
if StrServerReturn = '某个值' then
begin
{处理代码}
end;
Application.ProcessMessages;
end;
end;
 
to kk2000:
我是在客户端获取服务器的返回值,你加的判断应该放在客户端吧?^_^

其实我在客户端的主窗口加判断等待:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
myClientSocket.Address := '192.168.100.15';//strServerIP;
myClientSocket.Port := 8899;
myClientSocket.Open;

while StrServerReturn='' do //加这段等待的代码,发现陷在里面出不来了,为么?
begin
sleep(10);
end;

showmessage(StrServerReturn);//这时是个空值
end;
 
//代码应该放在客户端! 代码放错了. 晕!
procedure TfrmMain.FormCreate(Sender: TObject);
var
vStartTime: integer;
begin
myClientSocket.Address := '192.168.100.15';//strServerIP;
myClientSocket.Port := 8899;
myClientSocket.Open;
TimeOut := 6000; {超时时间设置, 这个可以自己定}
vStartTime := GetTickCount;
while true do
begin
if GetTickCount - vStartTime >= TimeOut then
begin
{超时处理}
end;
if StrServerReturn = '某个值' then
begin
{处理代码}
end;
Application.ProcessMessages;
end;
end;
 
后退
顶部