高手进来帮忙

nyf1220 2003-10-18 11:50:08
近来做个邮件服务器的东西, 用到进程池,谁可以给我讲讲,另外关于邮件服务器方面有什么好的建议,用什么做,都可以说说,如果觉得分不够,可以在加!谢谢
...全文
41 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nyf1220 2003-10-18
  • 打赏
  • 举报
回复
呵呵,这么快都回答了?
多谢,建神一小,和猛禽,分都给你2个吧
dickeybird888 2003-10-18
  • 打赏
  • 举报
回复
哈哈(·¥·)
学习学习!
猛禽 2003-10-18
  • 打赏
  • 举报
回复
邮件服务器?应该用线程池吧。

线程池一般是用于服务端应用的开发,以线程阻塞式TCP服务应用(一般INTERNET服务端应用常用的方式,当然还有其它一些更好的方式,但较复杂,不提)为例,每个客户端请求到达服务端,服务端程序就要创建一个线程来为此客户端提供服务,当有很多客户端连接,并且服务时间不长就结束的情况,服务端应用就需要不断的新建/销毁线程,而线程的创建和销毁都是比较消耗资源的。所以线程池应运而生。

ThreadPool本质上跟ObjectPool/ConnectionPool之类的有点像。

它也是在服务端启动时就先创建若干个Thread,当有客户端连接时就从Pool里取(如果有空余的话)一个现成的Thread,用完后再放回Pool中,这样就可避免不断地创建/销毁Thread带来的开销。当然如果Pool中的Thread用完了,那还是要创建新的Thread的。
pankun 2003-10-18
  • 打赏
  • 举报
回复
Email 服务器的简单实现
Email 服务器的简单实现
湖南艾邦信息技术有限公司

李岳梅

---- 贵刊1999年7月26日《编程技巧》栏目刊登的《监视POP3信箱》一文介绍了直接调用WinSock函数来进行POP3网络通信从而监视有无新邮件的方法。但我们知道从Delphi 3 开始,它自带的控件中有基于Internet开发的控件。如果我们充分利用这些控件开发Internet程序则可以简化编程工作,提高效率。鉴于目前POP3客户端的软件的种类繁多,(如Outlook Express,Foxmail 以及Web 方式下的各免费邮局),而服务器端(除Unix Email系统)很少公开原代码,下面我就向大家着重介绍一下利用 Delphi 4中Internet控件组的TClientSocket 和TServerSocket 控件来实现 Email POP3服务器端。如果您理解了Email POP3服务器的构造,相信也可以依葫芦画瓢写出Email SMTP服务器程序。在此基础上加入多线程技术使服务器能同时处理多个客户的连接请求,您就可以轻松地实现一个简单的Email服务器了。

---- 一. 设计思路

---- Email 系统采用C/S 结构。当用户想发送邮件时或收取邮件时在客户机上运行任意一个客户端程序,如Foxmail。在菜单’工具->选项’的邮件服务器里填上运行我们服务器程序的主机名。服务器主机24小时一直运行我们的服务器端程序,SMTP和POP3服务器程序分别在25端口和110端口侦听连接请求。当用户发信时,首先客户端会与服务器端建立Socket连接。然后开始一应一答的Client/Server间的通信。发信和收信时建立连接后服务器端分别要发送一个’250 OK’ 和’+OK pop3 server is ready ’的应答。客户端收到此应答后开始发送SMTP或POP3命令。POP3通信时一般最开始的命令是’user ‘和’pass’或’ apop’用以进行身份验证。注意由于POP3会话有3个状态,某些命令只在某特定状态下有效。当用户进行完所有的操作后发送一个’quit’命令。服务器端收到此命令即终止此次socket连接并继续侦听其他的连接请求。注意:POP3通信时客户端在Transaction状态下’quit’则进入update状态。如果从Authorization状态下’quit’则终止通信,而不进入Update状态。如果客户端不通过’quit’命令终止连接,POP3会话不会进入Update状态。而只有在Update状态下收到’quit’命令后服务器才会在断连前把标志为已删的邮件进行物理删除。

---- 二. 代码实现(以POP3为例)

---- 自定义TPOP类的描述:

SessionState = ( Init,Authorization, Transaction,Update);

TPop=class (TComponent)

public

UserName:string;//Email帐户名

PassWord:string; //Email口令

ReceText:Pchar; //server端收到的字符串

PopState:SessionState;

//pop状态:

init or authorization or transaction or update

MsgCount:integer; //邮件总数

SizeCount:integer; //邮件总大小

ReplyString:string;//服务器端发送的应答信息

DeleIndex:byte;//用户要删的邮件序号

ListIndex:byte;//list方法 的参数:

用户要列出的序号为listindex的邮件信息

RetrIndex:byte;//retr方法的参数:

用户要取序号为retrindex的邮件

TopIndex:byte; //top方法的参数

QuitFlag:boolean;//用户如果通过quit命断连则此变量为true;

反之(此时要把f_dele都置回0)

OldMsgCount:integer;//旧邮件数:Last 命令返回

//邮件头的各个域

HMsgId:string;

HReplyTo:string;

HDate:string;

HFrom:string;

HTo:string;

HSubject:string;

HMIME_Ver:real;

HContent_Type:string;

HContent_Transfer_Encoding:string;

HText:string;

//所有POP3服务器必须支持的命令

procedure user;

function pass:boolean;

procedure stat;

procedure dele;

procedure list;

procedure retr;

procedure noop;

procedure rset;

procedure aquit;

procedure tquit;

//扩展的可选择实现的POP3 命令

procedure top;

procedure last;

procedure apop;

procedure uidl;

end;

---- 1. 建立连接

---- 我们可以看到利用了Tclientsocket后客户端请求建立连接只需下面的代码。

with ClientSocket do

begin

Host := Server;

Active := True;

end;

---- 服务器端利用TserverSocket,一直在侦听110端口,若客户端有连接请求,则ServerSocketAccept事件会被激活,建立起连接。

procedure TMyForm.ServerSocketAccept(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text :=

'连接到 ' + Socket.RemoteAddress;

//pop对象初始化

pop:=TPop.Create(nil);

pop.PopState:=init;

pop.LoginResult:=false;

pop.QuitFlag:=false;

ServerSocket.Socket.Connections[0]

.sendtext('+OK ibonc pop3 server is ready'+crlf);

end;

---- 2. 通信

---- 服务器端收到客户端发来的信息,则会激活ServerSocketClientRead事件,通过ServerSocket的Socket.ReceiveText可以得到信息的内容。

procedure TMyForm.ServerSocketClientRead(Sender: TObject;

Socket: TCustomWinSocket);

var temp_command :string;

//存放接收到的命令行,并做去crlf的处理

begin

temp_command:=Socket.ReceiveText;

//to remove the crlf in command line

temp_command:=trim(copy(temp_command,1,

pos(crlf,temp_command)-1));

pop.ReceText:=pchar(temp_command);

if pop.popstate=init then

if strLIComp(pop.ReceText,'user ',5)=0 then

pop.user

else

ServerSocket.Socket.Connections[0]

.sendtext('-ERR user name please')

else if pop.popstate=authorization then

begin

if strLIComp(pop.ReceText,'pass ',5)=0 then

pop.pass

else if strIComp(pop.ReceText,'quit')=0 then

pop.aquit

else

ServerSocket.Socket.Connections[0]

.sendtext('-ERR pass word please');

end

else if pop.popstate=transaction then

begin

if strIComp(pop.ReceText,'stat')=0 then

pop.stat

else if strLIComp(pop.ReceText,'dele ',5)=0 then

pop.dele

else if strLIComp(pop.ReceText,'list',4)=0 then

pop.list

else if strLIComp(pop.ReceText,'retr ',5)=0 then

pop.retr

else if strIComp(pop.ReceText,'noop')=0 then

pop.noop

else if strIComp(pop.ReceText,'rset')=0 then

pop.rset

else if strIComp(pop.ReceText,'quit')=0 then

pop.tquit

else if strIComp(pop.ReceText,'last')=0 then

pop.last

else if strLIComp(pop.ReceText, 'apop ',5)=0 then

pop.apop

else if strLIComp(pop.ReceText, 'uidl ',5)=0 then

pop.uidl

else

ServerSocket.socket.connections[0]

.sendtext('-ERR no such command yet'+crlf);

end

end;

---- 3. 关闭连接

procedure TMyForm.ServerSocket

ClientDisconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

ServerSocket.Active := False;

//如果client端没有通过quit 命令断连,

则在断连时要把那些f_dele置为0

if pop.QuitFlag=False then

begin

MyForm.query11.Close;

MyForm.query11.Params[0].Asstring:=pop.UserName;

MyForm.query11.prepare;

MyForm.query11.execsql;

end;

end;

---- 三. 结语

---- 由于Email系统与数据库表结构的紧密联系,笔者没有写出各POP3命令的具体实现。相信读者在认真阅读了RFC1939之后不难写出实现函数。现在就动手为你的公司写一个自己的Email服务器吧!

 

From猛料
更多项目进度详情分享:智能小车开源项目文章汇总 我们为什么要做这件事? 困境:“跪求指点”的菜鸟一年比一年多,有空搭理菜鸟的大神一年比一年少。 原因:很多时候不是大神不肯帮忙,而是各种零散、离奇、重复的问题,浇灭了他们“扶弱济贫”的心。 对策:电路城团队深谙两方的急迫和苦衷,作为一个技术交流平台应有的责任,于是有了《来实战》的栏目构想,即每期选定一个富有启发性和趣味性的开源项目,由硬件设计大神带队,引领一批自愿报名加入的同道爱好者,从项目分析、思路梳理开始,逐步完成动手实践、项目调试,直到最后的完美再现和更进一步的功能升级。我们期望,今天的新手菜鸟,能用自己的勤勉好学,得到大神更多的关注和指导,更快加入硬件高手的行列;我们也期望,受益于这个项目的人们,也将更愿意帮助那些陷入迷茫的曾经的自己。 支持:电路城的美国兄弟工程师交流平台hackaday(www.hackaday.com)和摩尔吧视频平台(https://www.moore8.com/)... 关于开源项目,我们计划这样来操作: 1.对标摩尔吧中的中相关主题智能小车项目(基于恩智浦平台智能汽车),我们这次用基于意法半导体的STM32平台来打造多功能智能小车,最终实物性能如何?基于意法半导体平台的智能小车PK恩智浦智能小车,谁更胜一筹?电路城开源项目组现在开始就通过逐步实操并最终打造出来,最后实物演示操作对比。此外,我们将预留资源,增加创意点的功能:红外或者超声波避障、摄像头、激光测距、舵机等等(到时根据实际进度会有一定取舍调整)。 2.项目更新进度:每两天在《来实战》栏目上更新设计进度内容,在工程没有实质性进度的时候也可以在论坛发帖分享进行实施困难点、设计技术难点和原理讲解及器件分析等。 3.建立对应项目讨论群。利用现有已建立的技术Q群资源,我们在做每一个不同主题方向的项目时,为方便讨论同时活跃Q群用户,欢迎更多志同道合的小伙伴加进来参加开源项目讨论或给我们提供建议。 4.采购设计工具 工具:电焊台(刀头、尖头)、焊锡丝、吸锡器、助焊膏、烙铁架子带夹子、松香、热熔胶枪、螺丝刀、万用表、剪钳、镊子、钳子、海绵、美工刀、元器件收纳盒、手持钻孔机等等,以后可以慢慢完善。示波器以及信号源、多功能电源。 元器件及材料:采购电子元器件以及打板。 5.我们会定期举办开源项目直播交流,或制作一些项目设计过程中的小视频,在项目交流群中与大家分享,感兴趣的小伙伴马上加入我们吧。 6.建立开源项目贡献者名单荣誉榜,不定期在本开源项目页面更新。项目结束后,对该开源项目贡献突出的小伙伴,我们评选出“开源之星”给予神秘大奖奖励。开源项目贡献者名单会被注明在最终的开源项目方案中。 7.期待更多的志同道合的技术大咖加入我们“开源项目智囊团”,出谋划策,为开源贡献自己应有的力量。 8.这是一个开源项目,项目最终会被分享上传到“电路城-电路方案”频道,供大家免费下载。 智能小车开源项目开发周期 计划2020.3.5~2020.4.30内完成。 项目主要有以下几个阶段(每个阶段我们还会就开发过程中遇到的一些有价值的开发难点或经验教训,以直播的形式在摩尔吧开播,具体主题和时间后期持续更新,感兴趣的小伙伴可以关注下哈~): 第一阶段:设计的要求及技术指标 -硬件系统(确定硬件设计思路,出总体框图,完成主要器件选型及相关资料查找); -软件系统(确定程序流程框图,查看相关示例程序,一般传感器、相关模块会给示例程序); -设计方案介绍(整体设计方案的介绍,以及相关方案的对比); -工作原理介绍及说明(介绍功能参数、方案原理、相关科普); 第二阶段:硬件系统设计 -硬件系统各模块功能介绍(所用到的功能模块、传感器、少见器件学习以及出文章介绍); -原理图、PCB图或仿真图绘制(完成原理图设计,需制作实物还需进行PCB设计); -元器件选型与BOM表(跟据原理图设计同步确定元器件选型,给出具体BOM表); 第三阶段:软件系统设计 -使用单片机资源情况(单片使用资源介绍,完成一些基础的讲解,还有相关芯片器件); -软件系统各模块功能介绍(各功能模块程序设计流程图,程序实现原理); -程序编写及清单(进行总的程序编写,以及初步调试); 第四阶段:实物制作 -焊接(待元器件集齐,打板完成,进行焊接以及相关结构制作,模型安装等); -软件调试; -硬件调试(结合软硬件调试,完成程序修改,确保功能实现,验证硬件部分没有问题); -设计结果分析(测试功能、验证相关参数,有什么不足以及改正,对做的不好的地方留时间补救); -测试过程(完整测试的发表,实测); 第五阶段:项目总结 -完成知识总结等收尾工作; -整理打包完整的开源方案所有资料; -开源项目突出贡献者名单公布及颁发奖品。

1,593

社区成员

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

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