Socket多线程处理(200分)

  • 主题发起人 主题发起人 qzxy
  • 开始时间 开始时间
Q

qzxy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何让SERVER SOCKET接收多条数据,生成多个线程来处理。
 
ServerSocket1.ServerType := stThreadBlocking;
 
SERVER SOCKET本来就是多线程的。可以同时接受多个client的连接。
ServerSocket.ServerType := stThreadBlocking时我没用过。
但我在ServerSocket.ServerType := stNonBlocking时照样
可以处理多线程。例如:

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var ReceString : String;
i : integer;
begin
ReceString:=Socket.ReceiveText;//接受数据
for i:=0 to ServerSocket.Socket.ActiveConnections-1 do
if ServerSocket.Socket.Connections.handle<>Socket.Handle then
begin//判断是哪个线程
......
处理线程数据
ServerSocket.Socket.Connections.SendText('.....');
......
break;
end;
end;
 
有没有搞错? 这也叫多线程? 明明是一个单进程的循环嘛.

另外:
就您那段代码纯粹是在测试cpu的反应:

下面的过程和您的代码要做的工作有区别吗?
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var ReceString : String;
begin
ReceString:=Socket.ReceiveText;//接受数据
Socket.Sendtext('......'); //发送数据
end;
 
题目主要是问如何处理来自不同连接的不同数据。

两段代码当然有区别了,eyes你的代码能区别不同的连接吗?
如果要象IRC一样,把一个进程的TXT转发到其它
的线程里,你的代码行吗。

这样的写法是简单,不用写多线程,要不你还得写thread-safe code,
多麻烦啊
 
不好意思,写的不够清楚。我是意思是:
SERVER SOCKET可以同时接受多个数据请求,对于每个请求的数据分别生成线程去处理,处理完后将处理结果返回给相应的请求,然后该线程结束(类似于UNIX的FORK)。
最好能有较完整的源码,我愿再多出200分。
 
在服务器端,Delphi将为每一个阻塞方式的连接自动分配一个新的线程,
并且用TServerClientThread来操作每一个线程。我这儿有一些代码,不知
道能不能对你有些启发:
Procedure TMyServerThread.clientExecute;
var stream:TWinSocketStream;
Buffer:arrar[0..9]of char;
Begin
{一直循环,到线程终止或连接断开}
While (not Terminated) and ClientSocket.Connected do
Begin
Try Stream:=TwinSocketStream.Create(ClientSOcket,60000);
try
{填充Buffer数组}
FillChar(Buffer,10,0);
{给客户60秒的时间}
If Stream.WaitForData(60000) then
Begin
{在这里取数和给客户返回信息}
......
End
Else ClientSocket.Close;
Finally
Stream.Free;
End;
Except
HandleException;
End;
End;
End;
要创建线程对象,最好在处理OnGetThread事件的句柄中进行.
注意:把CreateSuspended参数设为 Flase.
 
hntangwei:
你的例程好像是D4里的例程。我看了还是不大明白。
你的例程中讲的是CLIENT SOCKET,我要处理的是SERVER SOCKET,不知是否一样?
关于线程的控制?
有没有更详细一点的?

谢谢!
 
不大符合原意,但还是接受答案了。
 
后退
顶部