请教:服务器端的 ClientSocket1 的向 客户端 ServerSocket1 发送可以,反过来不行?
请教:
服务器端:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
private
iStatus : Integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Close; //首先关闭断开原先的连接
ClientSocket1.Address:= '192.168.0.118 '; //赋远程机的 IP 地址
ClientSocket1.Open; //建立 socket 连接
while iStatus = 0 do Application.ProcessMessages;
if iStatus = 1 then ClientSocket1.Socket.SendText( 'hghghj ');
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
iStatus := 1;
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
iStatus := -1;
ErrorCode := 0;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ss:string;
begin
ss:=Socket.ReceiveText;
showmessage(ss);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if ServerSocket1.Active = false then //打开 ServerSocket1
begin
ServerSocket1.Active:=true;
end;
end;
end.
客户端:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
ClientSocket1: TClientSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
private
Clientserver:boolean; //用来判断远程的 ClientSocket1 是都向 本机发送了 连接请求,并且是否成功了
{ Private declarations }
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if ServerSocket1.Active = false then //打开 ServerSocket1
begin
ServerSocket1.Active:=true;
end;
//**************** 用来判断远程的 ClientSocket1 是都向 本机发送了 连接请求,并且是否成功了*******
Clientserver:=false;
//**************** 用来判断远程的 ClientSocket1 是都向 本机发送了 连接请求,并且是否成功了*******
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ss:string;
begin
ss:=Socket.ReceiveText;
showmessage(ss);
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Clientserver:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address:= '192.168.0.118 ';
ClientSocket1.Open;
while (Clientserver = false) do //连上了远程
begin
Application.ProcessMessages;
end;
if (Clientserver = true) then
begin
ClientSocket1.Socket.SendText( 'csok '); //告诉客户端和服务器端连接起来了
end;
end;
end.
现在我单击 服务器端的 Button1 ,则客户端可以收到 服务器发过来的字符串
但是我单击 客户端的 Button1 , 则服务器端不能收到 服务器发过来的字符串
各位大哥,这是什么原因?
还有,while iStatus = 0 do Application.ProcessMessages;
这里可以改一下吗?改为 多少秒还是连接不上
则放弃,不然,别的就不能用 ClientSocket1 啊
(也就说,我可能用 ClientSocket1 向Address 为 '192.168.0.119 '
的发送连接请求)
我试这个程序
服务器端和客户端是在同一台计算机上
但是是使用不同的端口
(我想应该不是服务器端和客户端是在同一台计算机上的原因)
谢谢!
[解决办法]
客户端连接上来后要把状态保存下来才能发,服务端不用IP地址.因为客户端连接时已有IP地址了.如果不保存状态,要发送的时间也可以到所有连接中去查,IP地址和你要发的一个一样就用这个发就行了.