请问大家如何做多线程的scoket通讯啊,小帝都要急死了!哪位大哥能给出个例子啊?200分相赠! ( 积分: 200 )

  • 主题发起人 主题发起人 a70a70
  • 开始时间 开始时间
A

a70a70

Unregistered / Unconfirmed
GUEST, unregistred user!
领导突然要求我做这个项目,小弟以前没做过类似的东西,现在求大家帮帮忙了!
 
领导突然要求我做这个项目,小弟以前没做过类似的东西,现在求大家帮帮忙了!
 
你看一下OICP东东。
 
说说具体应用,这样大家也好帮你呀!
 
在服务端开启socket监听,
每当收到一个客户端连接请求时,就开一个新线程,
在新线程中创建一个socket与客户端连接。
---
以上就是最简单的方式了。
 
那也不用创建多个Socket呀
服务器端放一个SocketServer可以同时和很多客户端通讯的
你还是没说明白你要完成的具体功能,
根据用途不同可能要选择TCP 或UDP,
 
直接用indy了
想用socket写,就参照它的了
最好的办法了
 
嗯,其实用多线程做挺好的,从中会有很多的收获的,如果控制的好的话,效率也不错。

当然也可以用IO模型来做,
 
这个东西是要求这么处理:
本地一台服务器,对端(银行端)需要不停的发送数据包,本地需要把这个数据包解包之后,按照包内的对应的要求,在数据库中查找到相应的数据,再给银行发送过去。
现在的问题是:如果我这端在处理数据的过程中,银行端仍然持续不断的给我这端发送数据包,本地应该如何处理?
我初步的想法是每来一个数据包,就开启一个线程,这样持续不断的处理下去不是,否则在处理的过程中,如果对方再往这里发数据,那样我这边的监控程序如果不再启动一个线程,那第二个数据包岂不是要超时?
还有一种想法,一个只管接收,之后把请求放在库里,另一个只管根据库中的请求标志取出数据之后发送过去 ,这样做是否可行?
小弟实在着急,200分只是个意思而已,希望大家帮忙,多谢了!
 
这是我的程序处理的方法

////////////////////////////////////////////////////////////////////////////
//7.ClientSocket的OnRead事件定义
////////////////////////////////////////////////////////////////////////////
procedure TSGIPClient.ClientSocketOnRead(Sender: TObject; Socket: TCustomWinSocket);
var
nMsgLength: integer;
nBufferLength: integer;
nCommandId: LongWord;
nResult: integer;
sSequence: string;
sReserve: string;
sSendNumber: string;
sMsgContent: string;
sMsg: string;
CommandName: string;
MessageMemo: String;
begin
MainForm.Ima_SMG.Visible:=true; //将收到消息指示灯点亮
ClientSocketRecvMsg :=ClientSocketRecvMsg + ClientSocket.Socket.ReceiveText;
while (true) do
begin
nBufferLength:= Length(ClientSocketRecvMsg);
if (nBufferLength<4) then
break;
nMsgLength:= SocketStrToInt(copy(ClientSocketRecvMsg,1,4));
if (nMsgLength<nBufferLength) then //若消息未接收完,则不做处理
break;
//取出一个消息,并在缓存里删掉
sMsg:=copy(ClientSocketRecvMsg,1,nMsgLength);
ClientSocketRecvMsg:=copy(ClientSocketRecvMsg,nMsgLength+1,nBufferLength-nMsgLength);
//得到消息头的各个值
nCommandId:=SocketStrToInt(copy(sMsg,5,4));
sSequence:=copy(sMsg, 9, 12);
//根据消息类型进行处理
case (nCommandId) of
SGIP_BIND_RESP:

和你得第二种方法差不多
你也可以这么做:
一个socket负责接收数据,把数据写到一个接收消息列表中
然后再用一个socket随时监控消息列表。
这种办法还是比较稳妥的!
支持你这么做!!
 
看看那位大哥有更好的方法了
 
我用indy的IdTCPServer和IdTCPClient,他的server是当有新的连接自动创建新的线程来处理,你可以再加个timer来扫描,仅供参考
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
680
import
I
后退
顶部