如何由线程实现多个连接(100分)

F

foolnpl

Unregistered / Unconfirmed
GUEST, unregistred user!
要写一段代法实现这样的功能:每隔一段时间(时间间隔不能太长)给120(甚
至更多)个节点发送信息。为了提高效率,建立了若干(如12个)线程,每个
线程负责和10个节点顺次进行“连接--发送需要发出的信息--断开”。为了试
验这种做法是否可行,偶在先试了一个线程负责一个节点的情况,发送信息的节
点用clientsocket,接受信息的节点用serversocket,可是下面的代码总是无法
和接受信息的节点连接上;如果把tsendthread.execute的代码放在
tsendthread.create(...)中,则可以和接受信息的节点连接上。偶是DELPHI初学者,请各位大侠赐教。

unit thethread;{thethread.pas }
interface
uses
scktcomp,classes;
const threadnumber=3;
{使用到的线程数量}
const everythreadmax=5;{每个线程最多负责向everythreadmax个节点发送信息}
type
socketinfor=record
host: string;
{要连接的节点的host}
tosendstring :string;
{发给节点的信息}
end;

tsendthread=class(Tthread)
private
thinforarray: array[1..everythreadmax] of socketinfor;
thnum: integer;
{thnum纪录该线程要连接的节点数}
thclient_socket:tclientsocket;{该线程使用的Clientsocket对象}
procedure opensocket(var i:integer);
protected
procedure execute;override;
public
constructor create(var num: integer;
var tinforarray :array of socketinfor;var thdclient_socket: tclientsocket);
end;
var
clientnumber: array[1..threadnumber] of integer;
{clientnumber:第i个线程要连接的节点个数 }
mtinforarray: array[1..threadnumber,1..everythreadmax] of socketinfor;
clientsocketarray: array[1..threadnumber] of tclientsocket;
t1: tsendthread;
implementation
constructor tsendthread.create(var num: integer;
var tinforarray :array of socketinfor;var thdclient_socket: tclientsocket);
var
ei: integer;
begin
thnum:=num;
thclient_socket:=thdclient_socket;
for ei:=1 to thnumdo
begin
thinforarray[ei].host:=tinforarray[ei].host;
thinforarray[ei].tosendstring:=tinforarray[ei].tosendstring;
end;
freeonterminate:=true;
inherited create(false);
end;
procedure tsendthread.opensocket(var i:integer);
begin
if thClient_Socket.active then
thclient_socket.active:=false;
with thClient_Socketdo
begin
Host := thinforarray.host;
Active := True;
end;
end;
procedure tsendthread.execute;
var ei:integer;
begin
for ei:=1 to thnumdo
begin
thi:=ei;
opensocket(ei);
thclient_Socket.Socket.SendText(thinforarray[ei].tosendstring);
end;
end;

end.

//调用时{main.pas}
mtinforarray[1,1].host:='401b02';
mtinforarray[1,1].tosendstring:='Thread: NO.1,Client: NO.1';
clientsocketarray[1]:=clientsocket1;
clientnumber[1]:=1;
t1:=tsendthread.create(clientnumber[1],mtinforarray[1],clientsocketarray[1]);
 
@V@... ...
 
thread.Execute 才是运行在子线程。 thread.Create 还是运行在父线程。
thclient_Socket不应该在父线程中创建,而应该在子线程的 execute 过程中创建
 
pipi:
传递给thclient_socket只是一个clientsocket类型的参数,它在线程开始之前
就已经创建了。
请问,thclient_socket在父线程中创建和在子线程的 execute 过程中创建有
什么区别呢?偶想在线程中将一个clientsocket多次与不同的机器连接和断开。
 
在父线程创建的话,可能你会把一个ClientSocket用到多个子线程中,
引起冲突。在子线程中就没有这个问题。
 
多谢pipi和dreamtiger赐教。
在子线程中创建了clientsocket之后,如何判断连接成功,以便发送信息。如果希望连接成功之后立即发送信息,该如何编写代码。
 
while truedo
begin
1、判断是否超时了
2、application.ProcessMessages
3、判断 TClientSocket.Active
end;

第2种方法
在你的thread类里面写个过程 : procedure onconn(Sender:TObject)
cs:=TClientSocket.Create(nil) 后
cs.OnConnect=onconn
cs连接以后会调用 onconn
 
clientsocket的clienttype属性设置为阻塞,在clientsocke的onerror事件中
令errorcode:=0,当clientsocket连接一个无效的serversocket时,弹出一个异常
错误的警告窗体,有时还死机。
clientsocket运行在线程中,clientsocket的clienttype属性设置为非阻
塞,在clientsocke的onerror事件中令errorcode:=0,运行时则弹出异常错误的警
告窗体,有时还死机。
偶的程序要求clientsocket的运行在线程中,请问各位大虾,应该如何设置属性
以及如何编写代码。
 
Pipi的第二种方法我用过,可行。
{在你的thread类里面写个过程 : procedure onconn(Sender:TObject)
cs:=TClientSocket.Create(nil) 后
cs.OnConnect=onconn
cs连接以后会调用 onconn}
不过在响应onconn事件后应该调用TCustomWinSocket类。
所以建议thclient_socket:tclientsocket;改为
thclient_socket:TCustomWinSocket;
 
在与服务器连接的地方用try...except...语句,try出错误,再进行相应的处理(在调试时还是会raise exception,这是正常的)。
注意,不能在线程中采用非阻塞的方式,线程无法处理那些消息!
 
我也由类似的问题,关注!
 
我是在用BCB编写此类程序遇到的问题,关注!
 
每隔一段时间(时间间隔不能太长)给120(甚至更多)个节点发送信息!
为了提高效率?
为何不用multicast?一个线程发送一次就可以实现,这才叫提高效率!
 
什么是multicast?如何实现?
 
组播协议啊,只要120个点加入多播组,只要向多播组的地址发送一次,
所有人都可以收到的说,不过如果要过路由器的话,需要
路由器做一下配置的说。
 
接受答案了.
 

Similar threads

顶部