Y
yeow
Unregistered / Unconfirmed
GUEST, unregistred user!
我在此只讨论客户端的问题
客户端Socket有两种模式:
Blocking阻塞方式,是指读写端口的时候是同步进行的,未完成读写前不能在该端口上收发数据(端口处于阻塞状态)。可以理解为半双工。
NonBlocking非阻塞方式,是指读写端口的时候是异步进行的,读写指令会立即返回,不会引起端口阻塞,可以理解为全双工。
我现在正在写一个Socket客户端程序,服务器端允许多连接,数据交换是采用应答方式的。但是允许一次性发送多条请求而不必死死的等待回应才能发下一条请求。回应是异步回复的。所以我很自然的就用NonBlocking方式了。刚开始用的是单TCP连接,收发都很正常,但是速度(吞吐量)上不去。所以就要用多TCP连接方式并行发送请求了。我选择多线程(每个线程内一个TCP连接)并行发送,Socket模式还是采用NonBlocking。问题就来了:在线程内部不能正常打开TCP连接!代码如下:
在线程中我也不知道用什么方法能够“空等”,只好用Sleep()了。您能告诉我么?
我的理解(请指正):
1. 单连接可以用Blocking和NonBlocking中的任何一种,没有问题。
2. 多连接(多线程)就只能用Blocking了吗?
还是我的代码有问题?请指教,谢谢!
客户端Socket有两种模式:
Blocking阻塞方式,是指读写端口的时候是同步进行的,未完成读写前不能在该端口上收发数据(端口处于阻塞状态)。可以理解为半双工。
NonBlocking非阻塞方式,是指读写端口的时候是异步进行的,读写指令会立即返回,不会引起端口阻塞,可以理解为全双工。
我现在正在写一个Socket客户端程序,服务器端允许多连接,数据交换是采用应答方式的。但是允许一次性发送多条请求而不必死死的等待回应才能发下一条请求。回应是异步回复的。所以我很自然的就用NonBlocking方式了。刚开始用的是单TCP连接,收发都很正常,但是速度(吞吐量)上不去。所以就要用多TCP连接方式并行发送请求了。我选择多线程(每个线程内一个TCP连接)并行发送,Socket模式还是采用NonBlocking。问题就来了:在线程内部不能正常打开TCP连接!代码如下:
代码:
type
TMyThread = class()
private
FClientSocket: TClientSocket;
procedure SocketConnect(Sender: TObject; Socket: TCustomWinSocket);
protected
procedure Execute(Sender: TObject); override;
public
constructor Create;
// ...
end;
implementation
constructor TMyThread.Create;
begin
inherited Create(True); // Suspend
FreeOnTerminate := False;
FClientSocket := TClientSocket.Create(nil);
with FClientSocket do
begin // FRemoteIP是服务器的IP, FRemotePort是服务器的监听端口
Address := FRemoteIP;
Port := StrToInt(FRemotePort);
ClientType := ctNonBlocking;
OnConnect := SocketConnect;
// ...
end;
//...
Resume;
end;
procedure TMyThread.Execute(Sender: TObject);
begin
while not Terminated do
begin
// 打开TCP连接
if not FClientSocket.Active then // 每次循环进来都未打开
begin
FClientSocket.Open;
Sleep(300);
end;
// ...
end;
end;
procedure TMyThread.SocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin // 该事件始终无法正常触发!
// ...
end;
end;
在线程中我也不知道用什么方法能够“空等”,只好用Sleep()了。您能告诉我么?
我的理解(请指正):
1. 单连接可以用Blocking和NonBlocking中的任何一种,没有问题。
2. 多连接(多线程)就只能用Blocking了吗?
还是我的代码有问题?请指教,谢谢!