服务器程序的功能是循环扫描端口,检查是否有连接请求,若有,则按照即定的通讯协议进行电报文件的传输,传输完毕后继续扫描。同时显示接收的信息。
客户端程序的功能是按照特定的IP地址和端口进行连接,连接成功后和服务器程序通讯,尝试进行传输,发现有雨情内容传输后进行报警,并显示接收内容。
本文两个程序都用DELPHI7开发,使用LNDY组件,服务器程序使用IDTCPSERBER,客户端程序使用IDTCPCLIENT。为了程序的可移植性,所有的可变配置信息都从配置文件中读取,这里暂定为SERVER.MAP和CONNECT.MAP文件。SERVER.MAP中主要是服务器发送的文件和接受文件的目录。而CONNECT.MAP文件主要是客户端的用户名,连接的IP地址和端口,接受目录和发送目录,以及报警用的歌曲文件的目录。
一、运行服务器的代码:
程序首先读参数文件,读取用户名等参数后,开始扫描特定端口:
IdTCPServer1.DefaultPort :=StrToIntDef(Edit2.Text, 4356);
if not IdTCPServer1.Active thenIdTCPServer1.Active := True;
二、文件传输过程代码:
1.传输前的准备工作:当服务器程序发现某一个客户端连接后,首先读取客户端发送的命令字符串,以识别该用户身份,若身份合法,则寻找是否有给该用户发送的电报文件,并将找到的电报文件创建成文件流的形式,准备发送。当没有需要传输的文件时退出。
当有传输文件时以下语句创建一个新的文件流并读取大小:
AFileStream := TFileStream.Create(send_file,fmOpenRead);
ProgressBar1.Max := AFileStream.Size;
然后由服务器程序发送字符串,告诉客户端程序该文件流的大小,以便传输控制。
2.发送文件过程:
传输开始后,首先是客户端程序告诉服务器程序传输的位置,服务器程序先找到该位置,打开发送缓冲,输出一定大小的文件流,关闭缓冲,并用进度条显示当前传输的位置。文件发送结束后,对发送过的文件应做相应处理,比如存档或删除,否则会循环发送。当按照文件流大小发送完成后释放文件流。
在连接中如果要读文件,因为IP控件和文件操作中都有READLN语句,会发生冲突,可在文件操作语句前面加SYSTEM区别。
3.当客户端有文件返回时:
客户端发送一个协议的命令字符如'BACK',表示有文件返回服务器,这时是一个反的过程,由服务器告诉对端已经接受的大小,用一个REPEAT循环,直到接收的大小和文件流大小一直时发送协议命令“END”。无论哪个程序是接收方,都必须用TRY~FINALLY语句,确保通讯失败时通知对端程序结束,释放文件流。
传输文件主要使用WriteStream()函数,其原形是:
procedure TIdTCPConnection.WriteStream(AStream:TStream; const AAll: boolean = true; const AWriteByteCount: Boolean = False;const ASize: Integer = 0);
参数Aall 表示是否一次全部发送,参数AwriteByteCount表示是否在发送的信息中包含大小信息,参数Asize表示发送的大小。
4,为了更清晰理解服务器的程序,可对照客户端的代码:
客户端程序读取参数后,按照特定IP和端口去尝试连接,若连接成功,首先发送自己的用户名让服务器认证,若通过认证,会接收到一个字符串:“0”表示没有文件接收,则结束本次连接,大于0表示需要接收的文件流大小,按此准备文件流接收电报文件。
5.辅助功能:
报警:因为防汛工作的特殊性,为了水情信息能及时被发现,需要附加报警功能,利用DELPHI的MediaPlayer组件可以轻松实现。将需要播放的报警音乐文件(如MP3格式)的全路径赋予它的FILENAME属性,调用OPEN和PLAY方法即可。
签名:可以提供接报签名功能,将接报人的姓名和接收时间一起记录,签名合法时报警音乐才停止。
写返回文件:类似于即时通讯功能,用于双方工作人员的交流。
三、IP不固定问题的解决:
因为固定IP的费用较高,在没有固定IP的网络中为实现网络电报传输,可以在某个具有固定IP的机子上外挂个程序,专门中转服务器的IP地址,首先是服务器程序和该中转程序连接,告诉当时的IP地址,当客户端连接服务器时首先连接中转程序连接,接收最新的IP地址后,再连接服务器,通过实际使用,这种模式也可以照常工作。
[责任编辑:tuzhi]
| ·三峡水情分中心新水情信息编码运 (2006-03-02) |
| ·景德镇水情信息分中心建设 (2006-02-17) |
| ·2006年全国主要江河1月份雨水情 (2006-02-08) |
| ·“十一五”长江水情报汛将全面实 (2006-02-04) |
| ·珠江压咸补淡应急调水实时水情 (2006-01-16) |
| ·南水北调供水区石家庄市工业用水 (2005-12-07) |
| ·全国水情信息编码标准试点总结暨 (2005-11-17) |
| ·中新社:长江干线进入主汛期 水 (2005-11-17) |
| ·飞来峡水利枢纽水情遥测预报和调 (2005-09-09) |
| ·奎屯河流域水库水情自动化测报系 (2005-08-17) |