Delphi编写Socket通信程序问题?
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, Menus;type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    ClientSocket1: TClientSocket;
    listenitem1: TMenuItem;
    connectitem1: TMenuItem;
    disconnect1: TMenuItem;
    exit1: TMenuItem;
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure listenitem1Click(Sender: TObject);
    procedure connectitem1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.listenitem1Click(Sender: TObject);
begin
listenitem1.Checked:=not listenitem1.Checked;
 if listenitem1.Checked then
 begin
 clientsocket1.Active:=false;
 serversocket1.Active:=true;
 end
 else
 begin
 if serversocket1.Active then
 serversocket1.Active :=false;
 end;
end;end.要用name不是用caption这个是别人告诉我的,不然出错,写了要申明我不会,会的不小气,帮我改那句说声。menu没有checked属性这是怎么回事?在发个原创的。利用Delphi编写Socket通信程序。
  下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:
  1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解释原因。
  2、双击ListemItem。写入如下代码:
procedure TChatForm.ListenItemClick(Sender: TObject);
begin
ListenItem.Checked := not ListenItem.Checked;
if ListenItem.Checked then
begin
ClientSocket.Active := False;
ServerSocket.Active := True;
end
else
begin
if ServerSocket.Active then
ServerSocket.Active := False;
end;
end;
ListenItem.Checked := not ListenItem.Checked;和listenitem1.Checked:=not listenitem1.Checked;不一样为什么。不然一开始就错。

解决方案 »

  1.   

    一些代码 ,参考一下。。
    客户端:Function TForm1.ConnectionServer(const Server:string):Boolean;
    begin
      if SClient.Active then
        SClient.Active:=false;
      SClient.Port:= CPort;
      SClient.Host:=Server;
      try
        SClient.Active:=true;
        result:=true;
      except
        Showmessage('连接服务器失败!');
        result:=false;
      end;
    end;function TForm1.GetFileSize(Const FileName:String):integer;
    var
      FileS:TFileStream;
    begin
      FileS:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
      result:=Files.Size;
      Files.Free;
    end;procedure TForm1.SendFile;
    var
      Sendsize:integer;
      buf:array [0..Buffersize] of char ;
    begin
      if FFileStream.Size < 1 then
        LoadSendFile;
      if SFlagSize >= BufferSize then
        Sendsize := BufferSize
      else
        SendSize := SFlagSize;
      // getmem(Buf,BufferSize);
      FFileStream.ReadBuffer(Buf,Sendsize);
      SFlagSize:=SFlagSize - SendSize;
      if SFlagSize = 0 then
      begin
        FFileStream.Clear;
        mmstatus.Lines.Add('文件传送完毕!');
      end;
      Try
        SClient.Socket.SendBuf(buf,SendSize);
      Except
        FFileStream.Clear;
        mmstatus.Lines.Add('传送文件错误!');
      end;
    end;Procedure TForm1.LoadSendFile;
    begin
      with FFileStream do
      begin
        Clear;
        LoadFromFile(FFileName);
        Position:=0;
        SFlagSize:=Size;
      end;
      // Leavings
    end;Procedure TForm1.StarSend;
    var
      FlagStr:String;
    begin
      With TOpenDialog.Create(nil) do
      begin
        if Execute then
        begin
          Flagstr:='SendFileinfo;'+ExtractFileName(Filename)+';'+Inttostr(GetFileSize(Filename));
          FFileName:=FileName;
          SClient.Socket.SendText(FlagStr);
          mmStatus.Lines.Add(FlagStr);
          mmstatus.Lines.Add('准备传送');
        end;
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      SClient.Active:=false;
      SClient.Close;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FFileStream := TMemoryStream.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FFileStream.Free;
    end;procedure TForm1.SClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      Showmessage('连接成功!!');
    end;procedure TForm1.SClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      FFileStream.Clear;
    end;procedure TForm1.SClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      receiveS:string;
    begin
      ReceiveS:=Socket.ReceiveText;
      mmStatus.Lines.Add(ReceiveS);
      if ReceiveS = 'FiletransferWork' then
      begin
        SendFile;
      end;
      if ReceiveS = 'FileTransferStop' then
      begin
        FFileStream.Clear;
        FFileStream.SetSize(0);
      end;
    end;procedure TForm1.BtnConnClick(Sender: TObject);
    begin
      self.ConnectionServer(EDIPAddr.Text);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      self.StarSend;
    end;
    服务端:Procedure TFrmServerFile.ConneRun;
    begin
      Trancing:=false;
      SServer.Port:=CPort;
      SServer.Active:=true;
      MemoStream.Clear;
      showmessage('服务器已经启动!');
    end;procedure TFrmServerFile.StopConn;
    begin
      MemoStream.clear;
      Trancing:=false;
      if SServer.Socket.ActiveConnections>0 then
      begin
        SServer.Socket.Connections[0].SendText('FileTransferStop');
        MmStatus.Lines.Add('当前任务停止!');
      end;
    end;Procedure TFrmServerFile.StartConn;
    begin
      if SServer.Socket.ActiveConnections>0 then
      begin
        Caption:='start';
        MemoStream.Clear;
        Trancing:=true;
        SServer.Socket.Connections[0].SendText('FiletransferWork');
        MmStatus.Lines.Add('准备好接受文件!');
      end;
    end;
    procedure TFrmServerFile.FormCreate(Sender: TObject);
    begin
      MemoStream:=TMemoryStream.Create;
      MemoStream.Position:=0;
      ConneRun;
    end;procedure TFrmServerFile.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      SServer.Active:=False;
      SServer.Close;
    end;procedure TFrmServerFile.SServerAccept(Sender: TObject; Socket: TCustomWinSocket);
    begin
      mmStatus.Lines.Add('客户:'+Socket.RemoteHost+'连接成功!')
    end;procedure TFrmServerFile.SServerClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      DataF:PDataFlag;
    begin
      DataF := New(pDataFlag);
      Dataf.FileName:='';
      Dataf.FileSize:=0;
      DataF.WorkFlag:=0;
      Socket.Data:=Dataf;
      socket.SendText('已经连接好,准备传输文件!'#13#10);
    //  socket.RemoteHost+' '
    end;procedure TFrmServerFile.SServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      Buf:array[0..buffersize] of char;
      dataf:PDataFlag;
      NumberBytes:integer;
      cmd:string;
    begin
      dataf:=Socket.Data;
      Case dataf.WorkFlag of
      0:
        begin
          cmd := Trim(Socket.ReceiveText);
          if pos('SendFileinfo',cmd) > 0 then
          begin
            DataF.FileName:=Trim(Copy(CMD,pos(';',cmd)+1,Length(cmd)));
            Dataf.FileSize:=StrToInt(Copy(Dataf.FileName,pos(';',Dataf.FileName)+1,Length(dataf.FileName)));
            DataF.FileName:=Trim(copy(Dataf.FileName,0,pos(';',dataf.FileName)-1));
            Dataf.WorkFlag:=1;
            socket.Data:=Dataf;
            mmStatus.Lines.Add('文件名:'+dataf.FileName+'文件大小:'+inttostr(Dataf.FileSize));
            userhost :=Socket.RemoteHost;
          end;
        end;
      1:
         begin
           if Trancing then
           begin
             begin
               NumberBytes:= socket.ReceiveLength;
               socket.ReceiveBuf(buf,NumberBytes);
               MemoStream.Write(buf,numberBytes);
               if numberbytes >= BufferSize then
               begin
                  socket.SendText('FiletransferWork');
                  mmstatus.Lines.Add(inttostr(NumberBytes));
               end;
               if numberbytes < BufferSize then
               begin
                 socket.Sendtext('FileTransferStop');
                 MemoStream.Position:=0;
                 try
                   mmstatus.Lines.Add('来自:'+Socket.RemoteHost+ '的文件传送完毕!');
                   Trancing:=false;
                   Dataf.WorkFlag:=0;
                   socket.Data:=Dataf;
                   MemoStream.savetofile(DataF.filename);
                 except
                   showmessage('在保存文件时出现错误!');
                   exit;
                 end;
                 Memostream.clear;
               end;
             end;
           end;
         end;
       end;
    end;procedure TFrmServerFile.BtnStartClick(Sender: TObject);
    begin
      StartConn;
    end;procedure TFrmServerFile.BtnStopClick(Sender: TObject);
    begin
      stopconn;
    end;procedure TFrmServerFile.BtnDisConneClick(Sender: TObject);
    begin
      SServer.Socket.SendText('我要断开了!');
      SServer.Active:=False;
    end;procedure TFrmServerFile.BtnCloseClick(Sender: TObject);
    begin
      Close;
    end;
      

  2.   

    昨天写了个简单的例子。
    http://www.ahjoe.com/source/srcdown.asp
      

  3.   

    可以直接看DELPHI自己带的例子