Socket的线程问题(50分)

  • 主题发起人 主题发起人 WorldCreater
  • 开始时间 开始时间
W

WorldCreater

Unregistered / Unconfirmed
GUEST, unregistred user!
1.如果有多个ClientSocket连接到一个ServerSocket上
如何得到连接的ClientSocket的个数
2。怎样利用ClientSocket和ServerSocket编写多线程程序
如:
现有多个ClientSocket连接到一个ServerSocket上
现在要对每个连接建立一个线程分别响应客户请求,应怎么写
 
1.我的方法是来一个加一个,走一个减一个。自己实现
2.serversocket.connection[n].socket.sendtext,
响应事件就更简单了直接socket.sendtext
 
用阻塞模式!Server端为每个连接创建一个TWinSocketStream;
如下是模拟 FTP 的服务端中的一段代码;细节Delphi的帮助中有!

while (not Terminated) and ClientSocket.Connected do begin
try
Stream:=TWinSocketStream.Create(ClientSocket, ConnectWaitTime);
try
if Stream.WaitForData(RespondTime) then begin
Stream.Read(Buffer, TalkBufSize);
if Buffer[1]='R' then { Download resent Block }
TrFStream.Seek(-fReaded, soFromCurrent);
fReaded:=TrFStream.Read(Buffer, TalkBufSize);
Stream.Write(Buffer, fReaded);
if fReaded=0 then begin { 文件传送完成 }
TrFStream.Free;
ClientSocket.Close;
end;
end else begin
TrFStream.Free;
ClientSocket.Close; { 读超时 }
end;
finally
Stream.Free;
end;
except
HandleException;
end;
end;
 
to:OopsWare
这段代码好像我在帮助里见过,不过还是要谢谢你
to: :timerri
1。就是说 ServerSocket 确实没有自己的计数器了
2。这种方法不方便
最好让他自动确定是和谁通信
 
1、ServerSocket.Socket.ActiveConnections 就是客户连接数量
2、ServerSocket.ServerType = stThreadBlocking 就是用子线程来收发的

 
delphi好像不提供,你应该自己维护一个用户列表来区分每个连接
 
to OopsWare:
我用 TWinSocketStream 接收不到信息是什么原因
注释中的是我原来的代码
void __fastcall TSrvrClntThrd::ClientExecute(void)
{
int ReceiveLength = ClientSocket->ReceiveLength();
void* Buf = AllocMem( ReceiveLength+1 );
ClientSocket->ReceiveBuf( Buf, ReceiveLength );
// ShowMessage( (char*)Buf );
PostMessage( TradeMsgRollForm->Handle, XXX, (unsigned int)Buf, 0 );

/*
while( !Terminated && ClientSocket->Connected )
{
TWinSocketStream* pStream = new TWinSocketStream( ClientSocket, 60000 );
try
{
int ReceiveLength = ClientSocket->ReceiveLength();
void* Buf = AllocMem( ReceiveLength+1 );
ClientSocket->ReceiveBuf( Buf, ReceiveLength );

//PostMessage( TradeMsgRollForm->Handle, XXX, (unsigned int)Buf, 0 );

if( pStream->WaitForData(60000) )
{
if( pStream->Read(Buf,ReceiveLength) == 0 )
ClientSocket->Close();

AnsiString TestBuf = (char*)Buf;
PostMessage( TerminalMsgRollForm->Handle, XXX, (unsigned int)Buf, 0 );
}
else
{
delete Buf;
}

}
__finally
{
delete pStream;
}
}
*/
}
 
大家不能再谈谈么
为什么我的代码收不到数据
 
大家不能再谈谈么
为什么我的代码收不到数据
请给我解释一下,就要结账啦,真对 不起
拖了这么久
 
ClientSocket->ReceiveBuf( Buf, ReceiveLength );
好象已经将数据接收掉了,
if( pStream->Read(Buf,ReceiveLength) == 0 )
当然就收不到数据了。
====================================
>>要对每个连接建立一个线程分别响应客户请求,应怎么写
线程 TMyThread 中增加一个属性 cskCon :TCustomWinSocket
在 ServerSocket 的 OnGetThread 中

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
var
mySocketThread :TServerClientThread;
i :integer;
begin
mySocketThread :=TMyThread.create;
i :=Serversocket1.Socket.ActiveThreads;
mySocketThread.cskCon :=serversocket1.Socket.Connections;
SocketThread :=mySocketThread;
//...
end;

在 TMyThread.exec 中用 cskCon 来取代 ClientSocket 进行发送接收,
每个线程将只操作自已的 Connection。

参见我的问题 DispQ.asp?LID=412531
 
不是这样的
原来我不用
void* Buf = AllocMem( ReceiveLength+1 );
ClientSocket->ReceiveBuf( Buf, ReceiveLength
这两行代码接收数据,用的是 TWinSocketStream
由于事情紧,暂时用 ReceiveBuf
接收

也就是说,我 原来 的代码中不含这两行代码
 
1.首先,ServerSocket模式是否正确?
ServerSocket应设为stThreadBlocking
2.你的发送数据有多长?跟踪一下发送与接收部分,可以先一部分一部分的跟,比如,在服务
器段先看看客户端联上是是否真的生成了相对应的线程,线程生成的正确吗?
3.你发的数据有多长?是否可能是因为接收数据未完,导致根本没有返回哪?
例如你要接1024,但是它只读到了900,那么它就还要读剩下的124,这种情况
应该考虑...
4. 发送的数据长度与接收的数据长度一样吗?


 
诸位真是吝啬
不能多讲些么
 
多人接受答案了。
 
后退
顶部