关于serversocket发送数据的问题---- 一个MM心头的问题(50分)

  • 主题发起人 主题发起人 chons
  • 开始时间 开始时间
C

chons

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用socket编程时遇到这样一个问题:在客户程序和服务程序分别加上clientsocket和
serversocket控件,当用clientsocket.socket.sendtext时,服务程序能接收.但用服务程序
反馈一些信息时用serversocket.socket.sendtext发送数据,运行时出现错误.是不是ser
versocket不能向用户程序发送数据?如果能的话,那么clientsocket怎么接收?望前辈指点
少女有礼了
 
我是用这种方式
procedure TfMain.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
strTemp:String;
begin
strTemp:=Socket.ReceiveText;
strReceive:=strReceive+strTemp;
if Length(strReceive) < 某数 then exit;
处理字符串strReveive
endl;
 
serversocket.socket是用来监听的,不是用来通讯的,当然错了。
procedure TForm1.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);
begin //^^
end;
上面那个Socket才是用来通讯的。用这个Socket来SendText就不会错的了。
 
同意onedolph
或用ServerSocket1.Socket.Connections[n].SendText发送(n用来指定给哪个客户端发数据)
 
你可以研究一下delphi的demo下有一个chat程序
常用的socket命令都用到了.
 
to zhhc:
请问如果我想对某一个clientsocket发送数据,用n如何指定?(只要我预料的
clientsocket接收数据,其它clientsocket的不接收)
 
ServerSocket1.Socket.Connections[n].SendText
中的n可以用n:=ServerSocket1.Socket.ActiveConnections获知!
 
>>shangcm
不对,ServerSocket1.Socket.ActiveConnections是当前与Server连接Client的总个数

在ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);中的Socket
就是可以与某一Client通讯的Socket,你可以在读取客户端传送过来的数据时候得到通讯的
Socket,然后可以用这个Socket查出其所对应的n。

 
知道客户端的ip吗
知道的话
在server 用个for查询一下就可以了
 
我是这么做的:
ServerSocket1Accept或ServerSocket1ClientConnect的时候,
把那些个Socket以及它的一些附加信息用一个TList保存起来。
你可以设计一个
TSockInf = record
Socket: TCustomWinSocket;
//other inforimaton;
end;
在ServerSocket1ClientDisconnect的时候把它从TList里删除。
然后,你想给哪个发你就从Tlist里根据附加信息找到该Socket,
就Socket.Senttext,就行了。
 
请问onedolph:怎样从Tlist里根据附加信息找到该Socket呢?
 
to 各位大虾:
能不能详细一点,我的意思是根据N指定向某一个clientsocket发送数据
我想如果要确定给某一个clientsocket发送数据,那么N的值应该跟
该clientsocket有一个对应关系吧!能不能给我写一段源代码?
 
第一个与Server连接的Client的N为0,第二个为1 ...
 
shangcm,不是吧,我觉得我都说的差不多了,还不明白?
for i:=0 to list.count-1 do begin
//比较一下,不就行了。
if () then begin
result:=rec.socket;
break;
end;
end;
不就行了?
 
onedolph:你的方法你自己可否实践过?
可能是我太愚笨,怎么试也不行!

后来我想了另外一个办法:
ServerSocket1.Socket.Connections[n]中的n是系统自动维护的,
也就是说,当客户端连接时自动在Connections中增加一个,当断开时自动减少一个,
那么问题的关键就是具体是哪一个n?因此我利用一个TStringList与Connections同步:
(1)当客户端连接时,在OnConnect事件中向TStringList中添加一个客户端的IP地址,
那么添加的TStringList的Index刚好与Connections中的n相对应;
(2)当客户端断开时,在OnDisConnect事件中从TStringList中删除一个客户端的IP地址,
也就去掉了Connections中的对应的n
(3)这样只要知道客户端的IP地址(可用Socket.RemoteAddress获知),就可以用
ID:=ClientList.IndexOf(Socket.RemoteAddress)获知该Connections的n
(4)用ServerSocket1.Socket.Connections[ID]调用所需的Socket的所有方法、属性了!

这个方法已经通过实验(五个客户端),的确可行!

大家认为这样有何不妥?请指正!谢谢!
 
to changcm:
我的做法可以,我以前玩过,但没有案底。
你的做法可以,不过,TStringList是在内存中的,如果你想把它显示出来,
可以用一个TListBox.Items来存,但是,如果,你想排序一下,那N的顺序就不对了。
而且你也只能存地址,其他信息你怎么办?
我的做法,TSocketInfo里你可以不仅存客户地址,还可以比如注册信息,如用户名,
性别等,不仅在OnAccetp时添加信息,过后也可以再从客户端送过来一些其他信息往里面加。
发客户端信息时,就可以有选择的发了,比如,有没有注册啊,根据性别来改变语气啊什么的。
n也可以从List.count里得到。
如果你愿意给我200分,我现做一个发给你。
 
onedolph:对不起,你可能误会我的意思了,我不是说你的方法不行,而是我没有试出来!
我之所以写出我的方法,只不过是想给大家一点建议(特别是叫chons的MM)。

说真的,你的方法我很欣赏,这也是我追着你问具体步骤的目的,
但是我手头上的程序很急,而且也比较简单,所以就没能去深究,请原谅!

还有,我认为你和我的性格很象,很想和你交个朋友,行吗?
<a href="mailto:shangcm@yccs.edu.cn">给我写信吧!</a>
 
你的错误是没有指定地址“用SEND,SENDTO 函数没有指定目的地址”,最简单的办法是:
for i:=0 to serversocket.socket.count-1 do
if serversocket.socket.connections.handle = socket.handle{指定的目的客户端} then
serversocket.socket.connections.sendtext()
 
其实服务端serversocket.socket.connections中的i并
没有跟客户端是绝对一一对应的关系,不过自己还是可以搞定
使用i向预想的某个客户发送数据,只要在connect和disconnect事件
加一些代码,就可以实现,具体操作我想你应该明白吧
 
后退
顶部