用客户端socket向多个服务器socket发送消息的时候,如果单个连的时候,第一个是连接不上的,而第二个是可以连通的.但是如果一起向他们发送的话,第一个会发生错误连接不上,但是连接第二个的时候,但是却连不上,会发生错误,为什么会这样???????
请各位高手帮帮忙啊!!!!!!!!!!!

解决方案 »

  1.   

    unit MessageForm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls,DateUtils,shellapi,mmsystem, DB;const
      WM_BARICON=WM_USER+200;type
      TMe_MessageForm = class(TForm)
        Button1: TButton;
        MyClient: TClientSocket;
        MyServer: TServerSocket;
        RecMessageTimer: TTimer;
        SeaMessageTimer: TTimer;
        GroupBox2: TGroupBox;
        RadioButton1: TRadioButton;
        RadioButton2: TRadioButton;
        RenYuanList: TListView;
        Bevel1: TBevel;
        Panel1: TPanel;
        GroupBox1: TGroupBox;
        Memo2: TMemo;
        GroupBox3: TGroupBox;
        Label4: TLabel;
        Label5: TLabel;
        DateTimePicker1: TDateTimePicker;
        EditHour: TComboBox;
        EditMinute: TComboBox;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure MyServerClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure MyClientError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure MyClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure RadioButton1Click(Sender: TObject);
        procedure RadioButton2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
         procedure getnextcomputer(index:integer);
      end;var
      Me_MessageForm: TMe_MessageForm;
      SendRenID:integer;
      SendRenName:string;implementationuses Message_DataModule, Message_Login;var
      RenYuanIndex:integer;
      ComputerList:integer;{$R *.dfm}
    //取下一个计算机
    procedure TMe_MessageForm.getnextcomputer(index:integer);
    begin
      if RenYuanList.Items[index].Checked=True then
        begin
          RenYuanIndex:=index;
          MyClient.Close;
          MyClient.Host:=RenYuanList.Items[index].SubItems[0];
          MyClient.Open;
        end
      else
        begin
          Index:=Index+1;
          ComputerList:=Index;
          if Index<=RenYuanList.Items.Count-1 then
            getnextcomputer(Index)
          else
            begin
              EditHour.ItemIndex:=0;
              EditMinute.ItemIndex:=0;
              Memo2.Text:='';
              Button1.Enabled:=True;
            end;
        end;
    end;
    //初始化
    procedure TMe_MessageForm.FormCreate(Sender: TObject);
    var
      i:integer;
    begin
      SendRenName:='qqqq';
      DateTimePicker1.Date:=Now;
      for i:=0 to 59 do
        EditMinute.Items.Add(inttostr(i));
      EditMinute.ItemIndex:=0;
     //做为接受方创建监听
      MyServer.Open;
    end;
    //作为发送端---将数据保存倒数据库中--给目标计算机一个响应
    procedure TMe_MessageForm.Button1Click(Sender: TObject);
    begin
      if RenYuanList.Items.Count<1 then exit;
      if Trim(Memo2.Text)='' then
        begin
          showmessage('请输入提醒内容!');
          exit;
        end;
      ComputerList:=0;
      Button1.Enabled:=False;  
      getnextcomputer(ComputerList);
    end;
    //连接时
    procedure TMe_MessageForm.MyClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      MyYear,MyMonth,MyDay:Word;
      MyString:string;
    begin
      DecodeDate(DateTimePicker1.Date,MyYear,MyMonth,MyDay);
      MyString:='目标用户:'+SendRenName;
      MyString:=MyString+#13+'提醒时间:'+inttostr(MyYear)+'年'+inttostr(MyMonth)+'月'+inttostr(MyDay)+'日'+EditHour.Text+'点'+EditMinute.Text+'分';
      MyString:=MyString+#13+'提醒内容:'+Memo2.Text;
      MyClient.Socket.SendText(MyString);
      ComputerList:=ComputerList+1;
      if ComputerList<=RenYuanList.Items.Count-1 then
        getnextcomputer(ComputerList)
      else
        begin
          EditHour.ItemIndex:=0;
          EditMinute.ItemIndex:=0;
          Memo2.Text:='';
          Button1.Enabled:=True;
        end;
    end;
    //发生错误
    procedure TMe_MessageForm.MyClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      showmessage('网络发生故障,'+RenYuanList.Items[ComputerList].Caption+'不能立即收到通知!');
      //取下一个计算机名称
      ComputerList:=ComputerList+1;
      if ComputerList<=RenYuanList.Items.Count-1 then
        getnextcomputer(ComputerList)
      else
        begin
          EditHour.ItemIndex:=0;
          EditMinute.ItemIndex:=0;
          Memo2.Text:='';
          Button1.Enabled:=True;
        end;
    end;
    //取到客户端发送数据
    procedure TMe_MessageForm.MyServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      MySoundPath:string;
    begin
      MySoundPath:=ExtractFilePath(application.exeName)+'Ringin.wav';
      sndplaysound(PChar(MySoundPath),SND_ASYNC or SND_LOOP);
      showmessage(Socket.ReceiveText);
      sndplaysound('c:\',SND_SYNC);
    end;
    //全选
    procedure TMe_MessageForm.RadioButton1Click(Sender: TObject);
    var
      i:integer;
    begin
      if RadioButton1.Checked=True then
        for i:=0 to RenYuanList.Items.Count-1 do
          RenYuanList.Items[i].Checked:=True;
    end;
    //全清
    procedure TMe_MessageForm.RadioButton2Click(Sender: TObject);
    var
      i:integer;
    begin
      if RadioButton2.Checked=True then
        for i:=0 to renYuanList.Items.Count-1 do
          RenYuanList.Items[i].Checked:=False;
    end;
    end.
      

  2.   

    unit MessageForm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls,mmsystem;const
      WM_BARICON=WM_USER+200;type
      TMe_MessageForm = class(TForm)
        Button1: TButton;
        MyClient: TClientSocket;
        MyServer: TServerSocket;
        GroupBox2: TGroupBox;
        RadioButton1: TRadioButton;
        RadioButton2: TRadioButton;
        RenYuanList: TListView;
        Bevel1: TBevel;
        Panel1: TPanel;
        GroupBox1: TGroupBox;
        Memo2: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure MyServerClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure MyClientError(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure MyClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure RadioButton1Click(Sender: TObject);
        procedure RadioButton2Click(Sender: TObject);
        procedure MyClientLookup(Sender: TObject; Socket: TCustomWinSocket);
      private
        { Private declarations }
      public
        { Public declarations }
         procedure getnextcomputer(index:integer);
      end;var
      Me_MessageForm: TMe_MessageForm;implementationvar
      ComputerList:integer;{$R *.dfm}
    //取下一个计算机
    procedure TMe_MessageForm.getnextcomputer(index:integer);
    begin
      if RenYuanList.Items[index].Checked=True then
        begin
          MyClient.Close;
          MyClient.Host:=RenYuanList.Items[index].SubItems[0];
          MyClient.Open;
        end
      else
        begin
          Index:=Index+1;
          ComputerList:=Index;
          if Index<=RenYuanList.Items.Count-1 then
            getnextcomputer(Index)
          else
            begin
              Memo2.Text:='';
              Button1.Enabled:=True;
            end;
        end;
    end;
    //初始化
    procedure TMe_MessageForm.FormCreate(Sender: TObject);
    begin
      MyServer.Open;
    end;
    //作为发送端给目标计算机一个响应
    procedure TMe_MessageForm.Button1Click(Sender: TObject);
    begin
      if RenYuanList.Items.Count<1 then exit;
      if Trim(Memo2.Text)='' then
        begin
          showmessage('请输入提醒内容!');
          exit;
        end;
      ComputerList:=0;
      Button1.Enabled:=False;  
      getnextcomputer(ComputerList);
    end;
    //连接时
    procedure TMe_MessageForm.MyClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      MyString:string;
    begin
      MyString:='提醒内容:'+Memo2.Text;
      MyClient.Socket.SendText(MyString);
      ComputerList:=ComputerList+1;
      if ComputerList<=RenYuanList.Items.Count-1 then
        getnextcomputer(ComputerList)
      else
        begin
          Memo2.Text:='';
          Button1.Enabled:=True;
        end;
    end;
    //发生错误
    procedure TMe_MessageForm.MyClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      showmessage('网络发生故障,'+RenYuanList.Items[ComputerList].Caption+'不能立即收到通知!');
      //取下一个计算机名称
      ComputerList:=ComputerList+1;
      if ComputerList<=RenYuanList.Items.Count-1 then
        getnextcomputer(ComputerList)
      else
        begin
          Memo2.Text:='';
          Button1.Enabled:=True;
        end;
    end;
    //取到客户端发送数据
    procedure TMe_MessageForm.MyServerClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      MySoundPath:string;
    begin
      MySoundPath:=ExtractFilePath(application.exeName)+'Ringin.wav';
      sndplaysound(PChar(MySoundPath),SND_ASYNC or SND_LOOP);
      showmessage(Socket.ReceiveText);
      sndplaysound('c:\',SND_SYNC);
    end;
    //全选
    procedure TMe_MessageForm.RadioButton1Click(Sender: TObject);
    var
      i:integer;
    begin
      if RadioButton1.Checked=True then
        for i:=0 to RenYuanList.Items.Count-1 do
          RenYuanList.Items[i].Checked:=True;
    end;
    //全清
    procedure TMe_MessageForm.RadioButton2Click(Sender: TObject);
    var
      i:integer;
    begin
      if RadioButton2.Checked=True then
        for i:=0 to renYuanList.Items.Count-1 do
          RenYuanList.Items[i].Checked:=False;
    end;
    procedure TMe_MessageForm.MyClientLookup(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    //先寻找目标计算机--找不到转下一个计算机
    //---------------------------------->>>>>>>>>>>关键在这里如果第一个计算机关机或者不存在的话,就是找不到计算机的话,会直接跳到错误事件,而存在的话,会在连接的时候发生错误,但是对下一个的连接为什么会有影响???
      
    end;end.