急需多线程传输(使用SocketServer和ClientServer组件)示例(200分)

  • 主题发起人 主题发起人 chrisn
  • 开始时间 开始时间
C

chrisn

Unregistered / Unconfirmed
GUEST, unregistred user!
急需多线程传输(使用SocketServer和ClientServer组件)示例
需要有登录确认
 
给点提示,或是部分资料也行啊
 
看看ICS控件的多线程例子吧,很好懂的
 
登录确认可以自己定制协议,比如说用一个数组或链表来记录已经登录确认过的IP地址,对
于没有登录过的IP地址的请求就发一个要求登录的消息给客户端,客户端在收到要求登录的
请求后就显示登录窗口。
方法:定义一个通信结构,在每次发送数据前把结构放在最前面发送,服务器端和客户端在
收到数据时都要根据数据头的信息进行分析判断
例:设通信结构内空为:
type TMyComInfo = record
int CMDType; //指令类型
int CMDMsg; //指令内容
end;

服务器端要求客户端登录时,
var comInfo: TMyComInfo;
begin
comInfo.CMDType = ctSysCommand; //设指令类型为系统指令(自己定义一个ctSysCommand的值)
comInfo.CMDMsg = cmAskLogin; //设指令内容为要求登录(自己定义一个cmAskLogin的值)
ServerSocket1.Socket.SendBuf(comInfo,SizeOf(comInfo));
end;

客户端要收到,并从数据头中分解出通信结构后
case comInfo.CMDType of
ctSysCommand:
case comInfo.CMDMsg of
cmAskLogin:
begin
LoginForm.ShowModal(); //显示登录窗
...
end;
end;
...
end;
想得还不成熟,欢迎大家探讨。
 
哪有ICS多线程的例子
 
为了考虑连接以及数据传输安全性,原本想把命令处理和数据传输分开来处理
求各位大虾高见
 
delphi的帮助中有Writing client threads 和 Writing server threads代码示例。
procedure TMyClientThread.Execute;
var
TheStream: TWinSocketStream;
buffer: string;
begin
{ create a TWinSocketStream for reading and writing }
TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
try
{ fetch and process commands until the connection or thread is terminated }
while (not Terminated) and (ClientSocket1.Active) do
begin
try
GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }

{ write the request to the server }
TheStream.Write(buffer, Length(buffer) + 1);
{ continue the communication (e.g. read a response from the server) }
...
except
if not(ExceptObject is EAbort) then
Synchronize(HandleThreadException); { you must write HandleThreadException }
end;
end;
finally
TheStream.free;
end;
end;

procedure TMyServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
{ make sure connection is active }
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0); { initialize the buffer }
{ give the client 60 seconds to start writing }
if Stream.WaitForData(60000) then

begin
if Stream.Read(Buffer, 10) = 0 then { if can't read in 60 seconds }
ClientSocket.Close; { close the connection }
{ now process the request }
...
end
else
ClientSocket.Close; { if client doesn't start, close }
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;
 
需要完整示例
 
完整的示例请见Delphi6/Demos/Internet/NetChat,Delphi自带的通过socket进行聊天的演示程序
 
看Delphi的Help
有个简单的例子
 
To newsweep:delphi自带的那个例子是单线程的,没用
看看这个例子 http://go7.163.com/luyear/delphi/Chat.rar
 
上面的例子作的很帅,很佩服!
 
哈哈,我再给你吧,不过要多加分
 
你的不行,还是看看我的这个吧
 
后退
顶部