当只有一个线程的时候,数据可以正确的返回到 客户端,
当有大于一个线程的时候, 服务器端接受一次数据后每个线称好像都被堵住似的,每个线程接收数据也停止了。例如 :
当只有客户端1连接到服务器上后,输入信息,可以正确被返回。
当客户端2连接到服务器后,输入信息,客户端1可以看到此信息,但根据跟踪发现 当服务器短通过保存的线程句柄向客户端2发送的时候,没有成功,好像被堵住的感觉。
这时候使用客户端2继续发送的话,好像数据全部都被堵住了,已连接的服务器都看不到。
但当客户端1发送信息时候,刚才被堵住的那些信息,又全部一骨脑全都发送出来了。
很奇怪 :(附上代码
procedure TCMServerThread.ClientExecute;
var
Data: array[0..1023] of char;
SocketStream: TWinSocketStream;
ADOQuery: TADOQuery;
ADOConnection: TADOConnection;
t:_Recordset;
ReceiveMessage :String;
begin
Synchronize(RegisterForm);
SocketStream := TWinSocketStream.Create(ClientSocket, 600000);
while not Terminated and ClientSocket.Connected do
try
FillChar(Data, SizeOf(Data), 0);
if SocketStream.Read(Data, SizeOf(Data)) = 0 then
begin
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
ReceiveMessage := Data;
Send(ReceiveMessage);
except
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
end;procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TCMServerThread.Create(False, ClientSocket);
end;procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) - 1);
end;procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) + 1);
end;procedure TForm1.RegisterThread(Thread: TServerClientThread);
begin
if Listbox1.Items.IndexOfObject(Thread) = -1 then
ListBox1.Items.AddObject(inttostr(Listbox1.Items.Count), Thread);
end;procedure TCMServerThread.RegisterForm;
begin
Form1.RegisterThread(self);
end;procedure TCMServerThread.RemoveForm;
begin
Form1.RemoveThread(self);
end;procedure TCMServerThread.Send(SMessage:String);
begin
Form1.SendAllMessage(SMessage);
end;procedure TForm1.RemoveThread(Thread: TServerClientThread );
var
INdex: Integer;
begin
Index := ListBox1.Items.IndexOfObject(Thread);
if Index <> -1 then
Listbox1.Items.Delete(Index);
end;procedure TForm1.SendAllMessage(SMessage:String);
var
i: Integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
with TServerClientThread(ListBox1.Items.Objects[i]) do
begin
Memo1.Lines.Add('index:' + inttostr(i) + ' Message'+SMessage);
ClientSocket.SendText(SMessage);
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Open;
end;
当有大于一个线程的时候, 服务器端接受一次数据后每个线称好像都被堵住似的,每个线程接收数据也停止了。例如 :
当只有客户端1连接到服务器上后,输入信息,可以正确被返回。
当客户端2连接到服务器后,输入信息,客户端1可以看到此信息,但根据跟踪发现 当服务器短通过保存的线程句柄向客户端2发送的时候,没有成功,好像被堵住的感觉。
这时候使用客户端2继续发送的话,好像数据全部都被堵住了,已连接的服务器都看不到。
但当客户端1发送信息时候,刚才被堵住的那些信息,又全部一骨脑全都发送出来了。
很奇怪 :(附上代码
procedure TCMServerThread.ClientExecute;
var
Data: array[0..1023] of char;
SocketStream: TWinSocketStream;
ADOQuery: TADOQuery;
ADOConnection: TADOConnection;
t:_Recordset;
ReceiveMessage :String;
begin
Synchronize(RegisterForm);
SocketStream := TWinSocketStream.Create(ClientSocket, 600000);
while not Terminated and ClientSocket.Connected do
try
FillChar(Data, SizeOf(Data), 0);
if SocketStream.Read(Data, SizeOf(Data)) = 0 then
begin
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
ReceiveMessage := Data;
Send(ReceiveMessage);
except
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
end;procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TCMServerThread.Create(False, ClientSocket);
end;procedure TForm1.ServerSocketThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) - 1);
end;procedure TForm1.ServerSocketThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
ThreadCount.Text := IntToStr(StrToInt(ThreadCount.Text) + 1);
end;procedure TForm1.RegisterThread(Thread: TServerClientThread);
begin
if Listbox1.Items.IndexOfObject(Thread) = -1 then
ListBox1.Items.AddObject(inttostr(Listbox1.Items.Count), Thread);
end;procedure TCMServerThread.RegisterForm;
begin
Form1.RegisterThread(self);
end;procedure TCMServerThread.RemoveForm;
begin
Form1.RemoveThread(self);
end;procedure TCMServerThread.Send(SMessage:String);
begin
Form1.SendAllMessage(SMessage);
end;procedure TForm1.RemoveThread(Thread: TServerClientThread );
var
INdex: Integer;
begin
Index := ListBox1.Items.IndexOfObject(Thread);
if Index <> -1 then
Listbox1.Items.Delete(Index);
end;procedure TForm1.SendAllMessage(SMessage:String);
var
i: Integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do
begin
with TServerClientThread(ListBox1.Items.Objects[i]) do
begin
Memo1.Lines.Add('index:' + inttostr(i) + ' Message'+SMessage);
ClientSocket.SendText(SMessage);
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket.Open;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货