首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问一个 C/S 的有关问题(TServerSocket相关)

2012-02-26 
请教一个 C/S 的问题(TServerSocket相关)当server接收到client的连接时,通过OnGetThread事件创建一个阻塞

请教一个 C/S 的问题(TServerSocket相关)
当server接收到client的连接时,通过OnGetThread事件创建一个阻塞的线程,用于接收数据,直到用户端断开连接。

如果在此期间,服务器端又想给客户端回发消息的话,是不是要另外开线程呢?

是否发送数据的线程发送完后就释放,而接收数据的线程就一直保持到连接断开呢?

或者哪位大虾能提供一份完整的TServerSocket多线程和客户端互相收发数据的代码给我看看吗?分不够可加。

谢谢。

[解决办法]
发送可以不需要线程,因为发送的时候已经可以知道有多少数据要发送,调用发送函数后也可以知道发送是否成功。
接收就不太一样,程序是无法预知何时会有数据到达和多少数据到达,所以需要采用阻塞式线程来守候数据的到达。
接收线程应该保持运行直到线程被终止或者连接被断开。
[解决办法]
不用线程,定义几个socket即可
TMainForm *MainForm;
TCustomWinSocket *SocketClient[5]; //获取客户的socket,写了5个,不够再加:)
//---------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ServerSocket-> Active)
{
ServerSocket-> Close();
}
}
//---------------------------------------
void __fastcall TMainForm::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{ static int i=0;
Memo-> Lines-> Add( "客户 "+Socket-> RemoteAddress+ "connected. ");
SocketClient[i]=Socket;
SocketClient[i]-> SendText( "欢迎连接服务器! ");
i++; //连接的客户用不同的Socket保存连接信息
}
//---------------------------------------
void __fastcall TMainForm::ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo-> Lines-> Add( "客户 "+Socket-> RemoteAddress+ "断开了连接. ");
//Socket-> SendText( "您已经断开了服务器,再见! ");
}
//---------------------------------------
void __fastcall TMainForm::ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Socket-> Close();
ErrorCode=0;
}
//---------------------------------------
void __fastcall TMainForm::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
String str;
String sDateTime;
sDateTime=FormatDateTime( "yyyy '年 'mm '月 'dd '日 ' AM/PM hh ': 'nn ': 'ss ",Now());

str=Socket-> ReceiveText();
Memo-> Lines-> Add( "From "+Socket-> RemoteAddress+ ": "+str+ " [ "+sDateTime+ "] ");

}
//---------------------------------------
void __fastcall TMainForm::suiButton1Click(TObject *Sender)
{
if(ServerSocket-> Active==false)
{ ServerSocket-> Active=true;
Memo-> Lines-> Add( "服务器已开始! ");
}
}
//---------------------------------------

void __fastcall TMainForm::suiButton3Click(TObject *Sender)
{
if(ServerSocket-> Active)
{ ServerSocket-> Active=false;
Memo-> Lines-> Add( "服务器已停止! ");
}
}
//---------------------------------------

void __fastcall TMainForm::suiButton4Click(TObject *Sender)
{
ServerSocket-> Port=StrToInt(Edit1-> Text);
Memo-> Lines-> Add( "端口号已设为 "+Edit1-> Text);
}
//---------------------------------------

void __fastcall TMainForm::suiButton5Click(TObject *Sender)
{ if(ComboBox1-> Text!= " ")
{ int i;
i=StrToInt(ComboBox1-> Text)-1;


if(SocketClient[i]!=NULL)
{ if(Edit2-> Text!= " ")
SocketClient[i]-> SendText(Edit2-> Text);
else
Application-> MessageBoxA( "发送数据不能为空! ", "错误 ",MB_ICONSTOP+MB_OK);
}
else
Application-> MessageBoxA( "没有此客户,不能发送消息! ", "错误 ",MB_ICONSTOP+MB_OK);
Edit2-> Text= " ";
}
else
Application-> MessageBoxA( "请选择给哪个客户通信! ", " ",MB_ICONSTOP+MB_OK);
}

热点排行