用TServerSocket控件做聊天服务器时如何编写多线程(100分)

  • 主题发起人 主题发起人 王中华
  • 开始时间 开始时间

王中华

Unregistered / Unconfirmed
GUEST, unregistred user!
用TServerSocket控件做聊天服务器时如何编写多线程
 
设置SOCKET的属性为多线程模式,然后自己写类
TMyServerThread=class(TServerClientThraed)
protected
procedure ClientExecute;override;
end
在 ClientExecute里写自己的处理代码,然后在ONGETCLIENTTHREAD的事件里CREATE这个
THREAD,然后返回给参数CLIENTSOCKET,就可以了,在此模式下,只有ONGETCLIENTTHREAD
事件可以出发,其他事件都完了,其实DELPHI的SOCKET写的不好,多线程和单线程应该分开
建议使用其他SOCKET控件,在WWW.inprises.com.cn上有DXSOCKET,绝对棒!
如果可以就给分噢!
 
可以用TNMMsg,TNMMSGServ,要简单许多。
如非要用TClientSocket,TServerSocket 以下代码也可做参考。注意VCL的线程安全问题。
type TMsgProcessThread = class(TThread)
private
From : string ;
Msg : string ;
protected
constructor create(sfrom :string;smsg :string) ;
procedure Execute ;
override ;public
end;
constructor TMsgProcessThread.create(sfrom :string;smsg :string) ;
begin
inherited create(false);
From := sfrom ;
Msg := sMsg ;
end;
procedure TMsgProcessThread.Execute ;
begin
synchronize(pastemessage) ;
terminate ;
end;
procedure TMsgProcessThread.pastemessage ;
begin
Form1.mReceive.Lines.Add (From + ' '+#13);
Form1.mReceive.Lines.Add( Msg+ #13);
end;
procedure TForm1.msgServerMSG(Sender: TComponent;
const sFrom,
sMsg: String);
var tempthread : TMsgProcessThread ;
begin
tempthread := TMsgProcessThread.Create(sfrom,sMsg ) ;
end;
 
TServerSocket需要你自己实现多线程机制么?
你只要把TServerSocket设成non-block的,你的ClientSocket就只管连上来就是了.
至于怎么判定/处理特定的ClientSocket,你可以自己内建一张表.在TServerSocket的OnConnect
事件里往表里添加连接上来的ClientSocket的Handle以及相关描述信息(比如聊天室里的nick),
以及在TServerSocket的ondisconnect事件里删除相应的ClientSocket Handle表项.
连接上来的ClientSocket Handle可以通过ServerSocket事件的socket参数获得.(Server Socket
的所有事件好象都有这个参数).要用时,比如ServerSocket的OnRead时,你可以通过onRead的
Socket参数在你的表里查找对应的信息然后决定具体的操作(比如,irc里,当a开b的小窗时,
你可以通过ServerSocket.OnRead的socket参数在表中查找判定说话人是a,对象是b,到表中找出nick为b
的人对应的socket handle,在ServerSocket.Socket.ActiveConnections里查找相应handle,再
再用ServerSocket.socket.ActiveConnections[n].sendtext发送就可以了),依此就可以实现
所有的操作.

 
你没怎么没人对多线程的socket 异常说些东西。
处理这些异常才是有意义的!!!
 
如何处理socket连接异常?如何获取和屏蔽这些异常?
 
如何处理socket连接异常?如何获取和屏蔽这些异常?
 
多人接受答案了。
 
后退
顶部