多线程数据传输,出错??? (100分)

  • 主题发起人 主题发起人 ply2002
  • 开始时间 开始时间
P

ply2002

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老大,利用clientsocket和seversocket做数据传输,client端采用阻塞,server端stThreadBlocking 一对一传输是正常的,但是我一打开多个client同时向sever端发送数据时,就出错了,望各位老大,指点一下!!以下是我源代码:

private
thr:tserverclientwinsocket;
//serversockitconnection : TCustomWinSocket;
var
myt:TClientThread;
procedure Tfrmsever.ServerSocketGetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
var
i :integer;
begin
myt:= TClientThread.Create(false, ClientSocket);
myt.thr:=clientsocket;
socketthread:=myt;
//i:=serversocket.Socket.ActiveThreads;
//myt.serversockitconnection:=serversocket.Socket.Connections[i-1];
end;

Procedure TClientThread.ClientExecute;
Var
ReceiveBuffer : Array[0..299] Of Char;
SocketStream : TWinSocketStream;
BytesRead ,j: Integer;
Begin
While Not Terminated And ClientSocket.Connected Do
Begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(ReceiveBuffer, 10, 0);
If SocketStream.WaitForData(5000) Then
begin
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead = 0 then
ClientSocket.Close
Else
begin
mystream.WriteBuffer(ReceiveBuffer, BytesRead);
end;
Until Not SocketStream.WaitForData(2000);
end;
finally
SocketStream.Free;
ClientSocket.Close;
mystream.clear;
end;
except
HandleException;
end;
End;
End;
 
怎么没人答呀,是不是我表达的不够清楚啊???54555
 
服务端代码增加一个对 TClientThread 的记数,以便读写时针对相应的 TClientThread
操作。上面代码我没看懂,但感觉是少了这个工作。
 
to 小雨哥
怎么修改,小弟在这方面实在太菜了,谢谢!!
 
to ply2002:
我无法提供更详细的资料给您,因为这个问题几乎涉及到了结构的安排,有些高手根本连
记数工作都不做,也可以设计出一个方案来实现这个目标,记数实现只是让服务器可以有
的放矢地对目标线程进行通信而不混乱,但并非是唯一的做法,而从结构开始提供资料,
几乎等于从头设计一个项目一样了。不过你可以在网上找到很多这种类型的实现代码,我
觉得,找一个现成的范例进行改进,比这样提问的效果要好得多。
 
有没有哪位老大给我说一下
ServerSocketGetThread的是不是对每个client连接都独立的产生一个线程,然后用ClientExecute独立的去执行各个client连接,各个连接是不是不会发生冲突啊???谢谢!!!
 
Server为每一个Client产生独立的线程,彼此应该不会有冲突。建议你找一个局域网聊天的例子看看,聊天例子应该是多线程的最简单应用。
 
to sydxw
如果我在每个产生的client的线程李共同调用一个过程,过程李有对表的查询和插入,会不会发生冲突啊??
 
当然会有冲突,建议使用同步或者临界区
 
拜托哪位大哥能给我一个这方面的例子
我的E-mail ylp98021117@yeah.net 谢谢了!!!!!
 
服务器有多少个线程是由你决定的,阻塞模式下,通常是一个线程对应一个客户端的连接。这样的编程是最简单的(每个连接的数据包不会紊乱),但效率最低。因为如果客户端有数百个甚至数千个时,服务器能否承受压力是个问题。
 
后退
顶部