请教Chat(Delphi自带例子)问题(100分)

  • 主题发起人 主题发起人 redsky.l
  • 开始时间 开始时间
R

redsky.l

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi3.0/Demos/chat下范例。

我将机器IP设置为:10.10.10.1,运行程序(在一台机器上),
有如下问题:

1、先运行的程序一定要作服务器端程序,否则客户端程序死机;
2、服务器程序一定要先退出,如果先退客户端程序会报错;
然后才能退出;
3、对它进行改进:服务器退出时向客户端程序传一信息,如“服务
器退出!”,不成功;

请问:这三种情况能解决吗?
 
1.一样的情况
2. ..
3.在clientsocket.ondisconnect 中直接showmeessage不就行了吗?!
 
2
try起来
3
说具体点
 
1, 我没有这种情况,
什么叫先运行起来的程序,你是单机测试吧。
2, 客户端当然会报错,但服务端应该 try 一下,
没试过。

3,
 
如果你不熟悉,不如干脆用ICS套件吧
 
用ICS吧,它自带的例子也有一个类似DELHPI中CHAT的例子。
好象只支持一个连接。
 
1.You can let the ServerSocket on listening in first,
then let the ClientSocket on Active.
2.You can write "ErrorCode:=0" in the CientSocket.onError event.
3.You can write The message in ClientSocket.onDisconnect event.
 
再说明一下:
本人是单机测试(没钱买两台电脑):本人不想用控件;请不要用E文;
关于第三点:
本人加上了如下语句:

procedure TForm_talk.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientSocket.Socket.SendText(Server+'与你断开连接!');
ListenClick(nil);
end;

procedure TForm_talk.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerSocket.Socket.SendText(Server+'与你断开连接!');
ServerSocket.Active:=false;
Listen.Checked:=not Listen.Checked;
ListenClick(nil);
end;

给果是:当充当客户端程序退出时,首先报错,充当服务器程序接受到消息,客户端
程序并不退出,再一次退出才行。
当服务器程序退出时客户端程序接受不到此信息。
 
各路大侠支持一下,如果分值不够,说一声。只要试试那原程序,举手之劳!!
 
我用的时候好象没有出现你这个问题,(Delphi4/Win98)
 
1、chat程序即是一个客户程序又是一个服务器程序,不知你是否将其分成了
两个程序(一个client,一个server?);
2、在同一台机子上同时运行两个chat就会报一个错:winsocket error:(10048),
on api 'bind',这是由于多个server侦测同一个端口造成的;
3、在客户端收到文本信息后,加一句clientsocket1.close
不知还会不会报错?
 
你是在同一部机上运行吧?,如果这样会有问题,因为端口号(Port)是唯一
的,不能有两个Socket的端口号是一样的。如果要在同一部机上运行,你可以编译
两个不同的Chat
如:
Chat1 ServerSocket.port=1024 ClientSocket.port=1025
Chat2 ServerSocket.port=1025 ClientSocket.Port=1024

即Chat1.ClientSocket.Port=Chat2.ServerSocket.Port
Chat2.ClientSocket.Port=Chat1.ServerSocket.Port

且Chat1.ServerSocket.port<>Chat2.ServerSocket.Port
 
{此时客户已向服务器请求关闭连接,客户Socket正存于FIN_WAIT状态,
此时发送数据会出错。}

procedure TForm_talk.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ClientSocket.Socket.SendText(Server+'与你断开连接!');
ListenClick(nil);
end;
{与客户端连接的活动Socket已关闭}
procedure TForm_talk.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ServerSocket.Socket.SendText(Server+'与你断开连接!');
ServerSocket.Active:=false;{关闭服务器主Socket}
Listen.Checked:=not Listen.Checked;
ListenClick(nil);
end;

要在服务器端关闭活动Socket可采用如下方法,关闭前可向客户端发数据。
ServerSocket.Socket.Disconnect(ServerSocket.Socket.Connections.SocketHandle);
 
谢谢各位。
 
后退
顶部