关于tserversocket的多线程问题!(300分)

  • 主题发起人 主题发起人 fust
  • 开始时间 开始时间
F

fust

Unregistered / Unconfirmed
GUEST, unregistred user!
多个客户端需要连接,并发传输数据量都在十几兆左右。服务端判断用户写入不同的文件
请问:tserversocket 线程该如何写?
还有是否一个clientsocket单独建立一个serversocket连接传输会快一点

请高手帮忙。多谢了。 最好有源码
 
再问一下:如果有5个连接,是否serversocket有5个ServerClientThread?
 
我也在关注
 
是有5个,我当初解决的方法是限制同时使用。我当初是限制5个用户,嘿嘿
 
不需要线程应该也可以解决,可能就是慢了一点
serversocket是可以处理多个连接的。
 
不必单独建立线程
 
TServerSocket 支持阻塞和非阻塞2种方式的tcp/ip接入,他们都支持同时多个连接。
一般用非阻塞的方式就不用线程,阻塞的方式一定要用多线程。

建议使用线程方式,对系统来说好些。每个连接单独的线程,根据不同的client请求处理。
你有5个client那么TServerSocket其实有6个Thread,因为还有一个一直在等待新的连接,
一旦有,他会在连接这个新的连接的同时,创建一个新的thread等待下一个client,

你的10M是每天还是每秒,这个主要去决议你机器的处理速度和网速了。
 

用户有80个左右,每天至少要连接一次,但是时间比较集中,
每次连接后需要传输10M左右的数据,服务端接收后还要分不同的用户予以处理。
如何给每一个连接用户指定线程,指定后 CLIENTREAD事件该怎么写?是否会自动
使用指定线程。
最好有源码,谢谢!!!
 
客户端的多线程发送该如何写?(线程中建立Tclientsocket)
 
与你一样正在制作...
 
以前的贴子:
1.将clientsocket的clienttype设为ctblocking,将serversocket的servertype
设为stThreadBlocking
2.将clientsocket的host和port设为serversocket的IP和端口号
3.自定义线程tdealthread:
TdealThread = class(TServerClientThread)
private
protected
procedure Execute; override;
public
thr:tserverclientwinsocket;
end;
4.在serversocket的serversocketgetthread事件中写入以下语句以便在接到clientsocket
端请求时启动tdealthread线程:
var
myt:tdealthread;
begin
myt:=tdealthread.Create(false,clientsocket) ;
myt.thr :=clientsocket;
socketthread:=myt;
end;
5.在serversocket的procedure TdealThread.Execute中写入每次接到clientsocket请求
时想要完成的动作,举例如:
var
mysockets:twinsocketstream;
rcvbuffer:array[0..299] of char;
sndbuffer:array[0..299] of char;
begin
mysockets:=twinsocketstream.Create (thr,20);
mysockets.WaitForData (1000);
mysockets.Read (rcvbuffer,300);//将client端数据取到rcvbuffer中
//......数据处理,将要发往client端的数据放到sndbuffer中
mysockets.WaitForData (1000);
mysockets.Write(sndbuffer,300);
end;
6.在客户端需要向服务器端提出请求时,执行下面程序:
var
myclientsockets:twinsocketstream;
rcvbuffer:array[0..299] of char;
sndbuffer:array[0..299] of char;
begin
clientsocket.active:=true;
myclientsockets:=twinsocketstream.Create (clientsocket.socket,20);
myclientsockets.WaitForData (1000);
//......将要传送的数据放入sndbuffer中
myclientsockets.write(sndbuffer,300);
myclientsockets.WaitForData (1000);
myclientsockets.read(rcvbuffer,300);//将serversocket发回的数据取到rcvbuffer中
clientsocket.active:=false;
end;
基本框架就是这样了,当然别忘了打开serversocket.

补充:
1.在自定义的线程中最好有循环处理过程:
vStream := TWinSocketStream.Create(ClientSocket, ConnectTimeOut);
while (not Terminated) and ClientSocket.Connected do
begin
//接收报文
....
//发送应答
.....
if ... then
ClientSocket.Close;
end;
ClientSocket.Close;
vStream.Free;
//接收和应答报文的格式自定义,可参考TCP/IP的实现方法

2.在应答前,最好有一小段延时,避免过分频繁的交换数据导致死机
sleep(..)
 
多人接受答案了。
 
后退
顶部