你可以参考Delphi自带的例程Delphi->Demos->Internet->chat
解决方案 »
- 关于打开文件的小问题,想用一个控件打开DAT文件和BMP文件!
- 散发
- 三层结构中,clientdataset的ApplyUpdates(0)为什么总是把已有的记录重新创建而不是修改,谢谢
- 怎样在DBGrid中显示MS Access中的memo数据?
- SQL语句的问题,大家帮我看看啊!
- 为什么TSpeedButton在Active Form中不会触发CM_MOUSELEVEL事件?自卑中
- 为什么用CALLBACK来定义将回调函数会加快回调函数的执行效率???
- 都说delphi编译器好,具体怎么体现的,我觉得查错和运行都跟vb差不多
- 如何拦截系统的wm_paint消息
- 点击Tool->Web App Debugger调试出错!!!
- 我在adodataset中刪除當前紀錄,為什麼會出錯??
- 有谁知道程序员大本营光盘中Delphi5.0 ADOExpress 升级包的注册码?
不过,来者有分!
我问的是局域网中的机器和外界的INTERNET上的机器通讯的问题!
分不是问题。
你到是很有趣啊.可以,等我问题解决之后就捐分给你。
to deathcat(从死亡边缘站起来的猫)
:我多台机器在局域网内,就一个IP。你知道信息该给谁?是不是我得写一个程序放在服务器上,用它和外界联系。而且由它负责接受外界的数据,分发到
局域网内的机器去?那QQ为何没要你在你的服务器上装东西?你如果有例子请给一个,不胜感激![email protected]
那是不是说QQ没有管这方面的事?而是由代理完成的?看来我的慨念有问题,还请高人指点。
建议你去看看http://xexploit.css.com.cn/sjjs/content/1jichu/2osi.htm。了解一下OSI结构哈。然后找本TCP/IP的书啃啃,推荐:
Internetworking With TCP/IP
你的多台电脑在同一个网内,当它们登录网络的时候肯定会自动获得一个IP的。(在网络环境下,计算机之间的访问全部都是通过IP地址来完成的。就好象我门的门牌号码一样)所以,你的计算机上即使没有设置IP地址也是一样的。你可以通过Socet来得到本机的IP地址。在Delphi下不是有两个Socket控件吗?一个是ServerSocket另一个是ClientSocket.你的服务器有两种做法,一种是做一个广播,给每个客户端都发送消息,然后在客户端做过滤,屏弃不属于自己的信息。另一种是在客户端登陆的时候,就将它记录到一个地方,然后根据某种标示(就好象QQ中的号码一样)找到相应的IP地址,再进行发送。服务器上用ServerSocket,客户端上用ClientSocket.
邮件代理服务器及其实现 邮件代理服务器
代理服务器是一种中转机构,它将来自客户端的请求转至远程服务器,同时将服务器的应答返回到客户端。其目的有二:一是使不可达路径变为可达,即路由型;二是对通信过程实施预定的监控,即应用型。
邮件代理服务器专用于电子邮件的收发传递,其中用于邮件发送的称为SMTP代理,用于邮件接收的称为POP3代理。电子邮件的收发分别采用SMTP和POP3协议,邮件客户端程序和邮件服务器之间通过一系列约定的命令序列和相应的应答信息,完成邮件收发。应用型邮件代理对邮件收发过程实施监控,必须对邮件的协议、编码等进行具体处理;而路由型代理只负责邮件请求和回应的中转,实现较为简单。本文给出一个路由型代理示例,在此基础上,通过截获和深入分析了解邮件收发过程全部信息,可以按需要进行应用型邮件代理的设计。本文程序中,SMTP和POP3都基于TCP/IP协议,编程接口为SOCKET,采用比较简明的面向对象设计方法,用VB语言实现。
SMTP代理服务器的实现
在FORM中设计两个SOCKET控件SktClient和SktServer,前者作为服务器方与邮件客户程序通信,后者作为客户方与远程邮件服务器通信。设计两个TEXT控件TxtClient和TxtServer,用于显示邮件客户端发送的命令请求及邮件服务器回应信息,置其属性为多行可滚动。在Form_Load()过程中填充以下语句,使SMTP代理运行后处于监听状态:
'SMTP缺省端口号
SktClient.LocalPort = 25
'监听邮件客户端连接请求
SktClient.Listen
监听到邮件客户端连接请求后,SMTP代理服务器立即连接远程邮件服务器,在SktClient_Connection Request()中加入:
'关闭监听,进行处理
If SktClient.State <> sckClosed Then SktClient.Close
'取得连接的ID号,连接远程邮件服务器
SktClient.Accept requestID
'远程邮件服务器地址
SktServer.RemoteHost = "10.120.15.205"
'端口号25=SMTP
SktServer.RemotePort = 25
'连接
SktServer.Connect
SktServer收到应答后在文本框TxtServer中显示数据,并转发给邮件客户端:
Private Sub SktServer_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
'取出数据
SktServer.GetData strdata
'取出数据
TxtServer.Text=TxtServer.Text+vbCrLf+strdata
TxtServer.Refresh
'服务器回应并转发到客户端
SktClient.SendData strdata
SktClient收到客户端数据后,取出数据在文本框TxtClient中显示,并将数据发送给远程邮件服务器:
SktClient_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
’取出数据,放在字符串strdata中
SktClient.GetData strdata
'在文本框中分行显示
TxtClient.Text=TxtClient.Text+vbCrLf+strdata
TxtClient.Refresh
'邮件客户端请求转发到远程服务器
SktServer.SendData strdata
在TCP/IP通信中,断开与连接一样由客户方发起,服务器方接收CLOSE消息,因此在SktClient_Close()中进行下列处理:
'关闭与邮件客户端的连接
SktClient.Close
'关闭与远程邮件服务器的连接
SktServer.Close
'继续监听下一次连接请求
SktClient.Listen
通过分析两个文本框中的信息,可以了解邮件发送整个过程的操作。由此根据SMTP协议可分离出发信人、收信人、主题、信件编码与内容、附件编码与内容等关键信息,使之扩展为应用型代理,对邮件发送进行监控。
POP3代理服务器的实现
POP3代理的难点在于要支持多信箱取件,因邮件客户端程序一般支持多个POP3信箱,所以设计前要了解邮件收取的过程。邮件客户程序首先向服务器发送连接请求,服务器应答后,客户端发送USER命令传递POP3用户名,服务器确认后,客户端发送用户口令,服务器再次确认,之后进入取信操作。多个POP3信箱下,远程邮件服务器是不确定的,故POP3代理要连接的对象不定。使用POP3代理时,通常在邮件客户程序的服务器处填上代理地址,再在用户名之后加隔离符注明实际POP3服务器地址(如hzh/10.120.15.205)。下面给出其实现代码,该控件设置与SMTP代理相同。在Form_Load()中添加如下代码:
'全局变量,1表示客户端已发出连接请求
First = 0
'POP3 端口号
SktClient.LocalPort = 110
'监听邮件客户端收取信件的连接请求
SktClient.Listen
SktClient收到邮件客户端请求时,远程POP3服务器地址还是未知的,不能进行连接,为使邮件客户程序继续进行操作,POP3代理必须向其发送伪应答信息:
Sub SktClient_ConnectionRequest()
'关闭监听,处理连接
If SktClient.State <> sckClosed Then SktClient.Close
’取得连接标识
SktClient.Accept requestID
’设置全局标志
First = 1
'向邮件客户端发送伪应答信号
SktClient.SendData "+OK POP3 server ready" + vbCrLf
邮件客户端收到伪应答后,接着向POP3代理发送USER命令,其中带有远程邮件服务器地址。POP3代理分离出邮件服务器地址,进行实际连接:
Sub SktClient_DataArrival(ByVal bytesTotal As Long)
Dim strdata,RemotePOP3Srv As String
Dim Pos As Integer
'取得邮件客户端发来数据
SktClient.GetData strdata
’分行显示
TxtClient.Text=TxtClient.Text+vbCrLf+strdata
TxtClient.Refresh
'邮件客户端发送USER命令时,POP3代理服务器解析远程服务器地址,并进行实际连接
If Left(strdata, 4) = "USER" Then
'找到字符"/"在串中的位置
Pos=InStr(strdata,"/")
'用户名,为全局变量
UserInfo = Left(strdata,Pos)
’远程POP3服务器地址
RemotePOP3Srv=Right(strdata,len(strdata)-Pos)
SktServer.RemoteHost = RemotePOP3Srv
'pop3端口号
SktServer.RemotePort = 110
’连接远程POP3服务器
SktServer.Connect
’其他情况下向服务器转发
Else
SktServer.SendData strdata
End If
远程POP3服务器收到代理的连接请求后,回送应答信息,该信息不再回传客户端。由于此时邮件客户端已经发出USER命令,POP3代理再立即将此命令补发给远程POP3服务器:
Sub SktServer_DataArrival()
Dim strdata As String
’取服务器信息
SktServer.GetData strdata
’显示应答信息
TxtServer.Text =TxtServer.Text + vbCr + strdata
TxtServer.Refresh
’第一次应答
If First = 1 Then
’复位标志
First = 0
’补发USER命令
SktServer.SendData userinfo + vbCrLf
'非第一次应答
Else
’转发到邮件客户端
SktClient.SendData strdata
End If
其他情况下POP3代理只做信息中转并记录,通过分析两个文本框中的内容,可以了解电子邮件收取全过程的所有信息。根据POP3协议,可以分离出发信人、收信人、主题、信件编码与内容、附件编码与内容等关键信息,为实现收信监控奠定基础。
邮件代理服务器的应用
邮件代理服务器可分为单用户和多用户两种版本。单用户版本在某一时间只支持一个用户操作。如本文的例子,它安装在邮件客户机器上,邮件程序中服务器地址可简单设为127.0.0.1或localhost。多用户版本可同时为多个邮件客户端做代理,其思想是由父线程专门负责侦听,侦听到连接后创建一个子线程具体处理该路通信,它通常安装在服务器上,在邮件客户程序中将服务器地址指向此机器。
要实现邮件代理服务器的应用,必须理解邮件编码格式。PC机上电子邮件的编码分两类,即UUENCODE格式和MIME格式。前者起源于UNIX系统,后者为一种多目标扩展,应用越来越广。MIME格式中,BASE64主要用于附件的编码,信件主体多使用QP、UTF-8(UNICODE)、UTF-7和HZ格式。它们具有明显的标志,判明编码格式后进行解码得到明文,处理完毕再编码转发或换码转发。应用型邮件代理服务器在实际中有十分广泛的应用,如邮件在线加密/解密、邮件过滤和病毒在线检查等。