客户端Socket连接多个服务器端socket的问题!!!!!!!!!

rehuo 2003-10-09 01:58:03
用客户端socket向多个服务器socket发送消息的时候,如果单个连的时候,第一个是连接不上的,而第二个是可以连通的.但是如果一起向他们发送的话,第一个会发生错误连接不上,但是连接第二个的时候,但是却连不上,会发生错误,为什么会这样???????
请各位高手帮帮忙啊!!!!!!!!!!!
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rehuo 2003-10-31
  • 打赏
  • 举报
回复
没有人回答吗?
rehuo 2003-10-23
  • 打赏
  • 举报
回复
unit MessageForm;

interface

uses
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;

implementation

var
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.
rehuo 2003-10-20
  • 打赏
  • 举报
回复
现在问题是第一个发生错误,而第二个可以连通,也会发生错误!改怎么做?
rehuo 2003-10-20
  • 打赏
  • 举报
回复
unit MessageForm;

interface

uses
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;

implementation

uses 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.
hare007 2003-10-20
  • 打赏
  • 举报
回复
mark
xiangwangz 2003-10-09
  • 打赏
  • 举报
回复
这样好嘛 ?你把你的源代码给贴出来,大家改改

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧