Indy tcp server

unit serverUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg, IdBaseComponent, IdComponent,
  IdTCPServer, ComCtrls, DB, DBAccess, MyAccess,MyRec;

type
  TDataState 
=  (dstNone, dstReceiving);    
  TForm1 
=   class (TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    BtStart: TButton;
    BtStop: TButton;
    BtClose: TButton;
    Image1: TImage;
    IdTCPServer1: TIdTCPServer;
    ProgressBar1: TProgressBar;
    MyConnection1: TMyConnection;
    procedure BtCloseClick(Sender: TObject);
    procedure BtStartClick(Sender: TObject);
    procedure echo(Data: 
String );
    procedure BtStopClick(Sender: TObject);
    procedure IdTCPServer1Exception(AThread: TIdPeerThread;
      AException: Exception);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
  
private
    { 
Private  declarations }
  
public
    { 
Public  declarations }
  
end ;

var
  Form1: TForm1;
  State:TDataState;

implementation

{$R 
* .dfm}

procedure TForm1.BtCloseClick(Sender: TObject);
begin
  Close;
end ;

procedure TForm1.echo(Data: 
String );
begin
  
if  ListBox1.Items.Count  > 20   then   ListBox1.Clear;
  ListBox1.items.append(Data);
end ;

procedure TForm1.BtStartClick(Sender: TObject);
begin
  BtStart.Enabled :
=   False ;
  IdTCPServer1.Active:
= true ;
  echo(
' 图片传送服务已启动  ( yiparts.com )');
  BtStop.Enabled : =   True ;
end ;

procedure TForm1.BtStopClick(Sender: TObject);
begin
  BtStart.Enabled :
=   True ;
  IdTCPServer1.Active:
= false ;
  echo(
' 服务停止');
  BtStop.Enabled : =   False ;
end ;

procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;
  AException: Exception);
var
  aFileSize : 
Integer ;       // aFileSize用来表示文件大小,整型
  aFileName : 
String ;     // aFileName表示文件名,字串型
  Buff : array[
0 .. 1023 of   Byte ;   //  Buff 缓存区大小设置,byte型
  ReadCount : 
Integer ;   // 实际每次读取文件块的大小,整型
  Stream : TFileStream;
  s,sCommand, sAction : 
string ;
begin
s :
=  AThread.Connection.ReadLn(# 13 # 10 100 );
sCommand :
=  copy(s, 1 , 4 );
sAction :
=  copy(s, 6 , 100 );
if  sCommand  =   ' SEND' then
  begin
  Stream:
= nil;
  
if  State  =  dstNone  then
    begin
    
if   not  AThread.Terminated  and  AThread.Connection.Connected  then
      begin
     
// aFileName : =  AThread.Connection.ReadLn(# 13 # 10 100 );
     aFileName :
=  sAction;
        
if  aFileName  =   ' ' then
           Exit ;
      AThread.Connection.WriteLn;
      AThread.Connection.ReadBuffer(aFileSize, 
4 ); // 开始读取文件长度,放进变量aFileSize中
      ProgressBar1.Max :
=  aFileSize;
      echo(
' 开始接收文件:'+ aFileName);
      Stream : =  TFileStream.Create(aFileName, fmCreate); // 创建一个文件流
      State :
=  dstReceiving;
      
end ;
    
end ; // State  =  dstNone
  
if   not  AThread.Terminated  and  AThread.Connection.Connected  then
  begin
      
// 读取文件流
      repeat
        
if  aFileSize  -  Stream.Size  >  SizeOf(Buff)  then
          ReadCount :
=  SizeOf(Buff)
        
else
          ReadCount :
=  aFileSize  -  Stream.Size;
        
// 从连接中读取 ReadCount长度的文件块放到缓冲区Buff,中
        AThread.Connection.ReadBuffer(Buff, ReadCount);
        
// 将缓冲区中的内容写进文件流中,这是就是写到文件aFileName中啦
        Stream.WriteBuffer(Buff, ReadCount);
        
// 文件流当前写的大小,值赋给进度条的位置
        ProgressBar1.Position :
=  Stream.Size;
        
// 显示已经传输和实际文件大小的比例
        Caption :
=  IntToStr(trunc(Stream.Size / 1024 ))  +   ' K/' + IntToStr(trunc(aFileSize/1024)) + 'K';
         // 这句作用是让消息传递动态显示起来,如果没有这句上面的caption是不会显示跳动的
        Application.ProcessMessages;
      
until  Stream.Size  >=  aFileSize;   // 直到文件大小和原文件大小一致结束循环
      AThread.Connection.WriteLn(
' OK');  //返回一个信息 OK,让客户端知道你读完了
   end ;
  Stream.Free;
  
// Stream: = nil;
  
// 定义成没有人连接,准备接受下一个人的连接
  State:
=  dstNone;
  echo(
' 文件接收完成');
  echo( ' 开始分析记录文件');

  
end // IF  SEND
end ;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
  echo(
' 客户端断开连接');
end ;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  echo(
' 客户端连接成功');
end ;

end .
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值