请教高手delphi的socket多线程编程问题!!!急...

dyzhao889 2004-07-13 01:06:59
各位高手:
在delphi中的 Socket编程,如果把ServerType设置为stThreadBlocking应该怎么样使用线程处理发送和接收数据呢???那里有例子看看吗???
先谢谢!!!
...全文
728 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
foreverzhang 2004-08-10
  • 打赏
  • 举报
回复
在阻塞方式下,最好把所有涉及到读或写的操作放在一个独立的线程中。
foreverzhang 2004-08-10
  • 打赏
  • 举报
回复
建议使用Indy控件。
YiOnLine 2004-08-10
  • 打赏
  • 举报
回复
我也被多线程所烦,
帮顶.
postren 2004-07-30
  • 打赏
  • 举报
回复
一个简单的例子,供参考
//================================客户端=====================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
OpenDialog1: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
s : TWinSocketStream;
f, f2: TFileStream;
begin
if not OpenDialog1.Execute then Exit;
ClientSocket1.Open;
s := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
f := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
try
s.CopyFrom(f, 0);
finally
s.Free;
f.Free;
ClientSocket1.Close;
end;
end;

end.

//========================================服务器端====================================
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
private
{ Private declarations }
public
{ Public declarations }
end;
TClientThread = Class(TServerClientThread)
private
public
procedure ClientExecute; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TClientThread.ClientExecute;
var
ReceiveBuffer : Array[0..1023] Of Char;
SocketStream : TWinSocketStream;
BytesRead : Integer;
F : TFileStream;
FileName: string;
begin
while not Terminated and ClientSocket.Connected do
Begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 100);
FileName := 'C:\afile';
if FileExists(FileName) then FileName := FileName + '0';
F := TFileStream.Create(FileName, fmCreate);
try
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0);
while SocketStream.WaitForData(5000) do
begin
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead = 0 then
ClientSocket.Close
Else
F.WriteBuffer(ReceiveBuffer, BytesRead);
end;
finally
SocketStream.Free;
ClientSocket.Close;
f.Free;
end;
except
end;
end;
end;


procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;

end.
zhengcg 2004-07-30
  • 打赏
  • 举报
回复
我觉得Delphi 7 自带的 Indy 很不错,对于服务器端,多线程控件本身已经实现。对于客户端,往往采用阻塞更加合理(一般都要等到收到数据了才能进行下一步的操作),如果觉得此时应用程序会“停”,可以加控件,TIdAntiFreeze 进行改善。
供参考。
xksyhjb 2004-07-30
  • 打赏
  • 举报
回复
用indy的
naughtyboy 2004-07-28
  • 打赏
  • 举报
回复
基本上不用delphi自带的了
自己从socket写起
www.20cn.net编程破解版search for "socket"有几片非常经典的文章
flyinwuhan 2004-07-28
  • 打赏
  • 举报
回复
只有自己从socket写起了
没有办法的

看看Delphi TCPClient的源码也许可以解决一些问题。。。但是我看不懂
sulemon 2004-07-27
  • 打赏
  • 举报
回复
建议还是定义一个多线程的类把,然后把创建socket和其他的操作写在这个类中
dyzhao889 2004-07-13
  • 打赏
  • 举报
回复
帮主:
怎么办???
dyzhao889 2004-07-13
  • 打赏
  • 举报
回复
请问楼上的:
那在SOKET的大量连接不用多线程应该怎么办??
agtian 2004-07-13
  • 打赏
  • 举报
回复
自己写这样的类
power_yhb 2004-07-13
  • 打赏
  • 举报
回复
其实DELPHI写的SOCKET控件并不好,本人在使用过程中也碰到了同样的情况特别是多线程写的时候,
我建议你还是不要用DELPHI自带的.

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧