关于局域网广播和组播控制范围的问题,(100分)

  • 主题发起人 主题发起人 fongwei
  • 开始时间 开始时间
F

fongwei

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,你们好,小弟在开发教学系统过程中遇到以下几个问题,一时解决不了,在论坛上搜了一下,也没找到满意的答案,只有向各位大虾求救了,望能帮小弟渡过难关。
1。我的局域网内有30台机器,都装有教学系统客户端,一旦上课,可以实现广播教学,但目前的需求是,只允许前十台建立连接的客户端使用系统,其他20台无权使用,该如何实现此功能呢?如果使用UDP广播,能达到这样的限制吗?这是我考虑的方法,但不知如何控制广播接受的台数。如果使用socketserver和clientserver是不是需要10个控件,分别连接啊,这不是我希望的。如果使用UDP组播又该如何判断呢?在论坛里看过几位大虾留的帖子,他们写的广播组播例程也看了,可小弟太笨,还是没有解决这个问题。
2。在使用过程中,允许学生分组通过局域网聊天的形式进行讨论,是不是该建立不同的组播分组,然后让学生自由加入任意分组呢?那又该怎么控制每组加入了多少名学生呢,怎么判断哪个组已经满员,不能加入呢?
3。在教师端发放文件时,如何实现群发呢?也就是所有客户端都能够收到服务器段发送的文件(任意类型)。另:我在实现点对点文件传输的时候,采用了Serversocket和clientsocket,测试了一下,超过20M就会丢失,不知道该怎么办,望高人指点。

以上是遇到的两个主要的问题,请各位大虾赐教,能够给提供一个例子,不胜感激,定百分送上
 
那位大哥帮忙啊,救命啊,分不够可以在加阿
 
全部 30 个连接算是很少客户,可以直接使用 TCP 连接,遍历广播就行。
UDP 广播直接控制谁能听,谁不能听无法做到,但可以编程动态提供广播解码,在代码
里,没有解码的客户,直接放弃广播信息的办法。
 
小雨哥:能说说广播解码,怎么做么?我没有做过这样的东西,完全没有概念,能够多指点一下,最好给个Demo好吗?多谢了。
 
第一个问题,我是这样想的:你这是局域网,可以设定IP,即是比如设定前十台为192.168.0.(0-255),另20台机子为192.168.1.(0-255),广播教学就用192.168.0.255,不知行不行??!!
 
1.UDP 模式:
UDP 是自带址协议,客户方向服务方发动连接时,自己向服务方提供端口和地址以及数据,
但不维持持续连接,发完就断开。Demos/FastNet 下有一个 UDP 演示。接收数据的过程是
这样的样子:
procedure (Sender:TComponent; Bytes: Integer; FromIP: String; Port: Integer)
这里可以对最早进入这个过程的前十个 FromIP、Port 进行登记吧。如果登记了,以后自己
可以定义一个过程对这十个客户进行遍历广播,而不使用 UDP 的 Network 广播。由于有可
能最早进来的会有重复同一个地址的情况,只要检查是否已经登记就行。遍历广播时需要对
RemoteHost 和 RemotePort 进行逐一绑定就行了啊。
2.TCP 模式:
反正按 Delphi 安排的做没错的,例子看 Demos/Internet 下的 chat 。原理也类似,问题
是在 TCP 下它是安排 Active := True ,Active := False 来工作的,所以需要对每客户进
行登记,不然怎么控制哪个客户为 True 哪个为 False 。TCP 中不关心 FromIP 和 Port,
只关心指向的是哪个客户,所以针对客户的广播,必须是遍历客户的。爱给哪个就播给哪个。
这些就是基本的概念了,再通俗就误人了。建议反复看看上面提到的例子的工作。
 
to 小雨哥
对于第一点,我觉得如果这样实现的话,那和直接采用tcp进行连接有什么区别呢?一开始局通过客户端进行登记,建立若干条tcp连接,反而更省事,,你说呢?,我的想法就是用UDP一步到位,不做遍历,如果做遍历,效率估计是跟不上吧,我觉得。
对于第三个问题,不知道能够给些提示,难道还是用UDP去做,万一丢包就不好办了阿。
 
把udp的端口号设的不一样.
 
自己控制连接数,如超过总数后不准连接
 
查询连接数,超过10就不准连接。
 
是啊,有 TCP 之嫌,但效率倒不是你想象的那样差。丢包的问题我也想过,TCP 就给出例
外了,UDP 是不管的,我测试了回馈的做法,觉得应该也可以做好的,这样一来,又有 TCP
之嫌了。事实上,TCP 传输只能讲相对可靠,不然也不要考虑断点续传了,何况你是超过
20 MB 的文件,在局域网中,20 MB 似乎不是很大,但一个 TCP 服务进程对十个客户进程
的结果就是 200 MB,你在每个 20MB 之间很难分段,UDP 似乎还可以启动一个辅助线程协
助收发,只要网络带宽够威,TCP 决无可能辅助吧,于是可能需要重新连接,开新线程对付
其他客户,就象你提的“难道要多个 socketserver 和 clientserver 了”。如果真这样,
设计无疑是失败的。(另 TCP 连接的强度,看我的一篇 Keylife 中的测试)。
以上只是我个人的观点,虽然其中有些我是经过测试后的观点,但由于 TCP 的设计因水平
问题有很大的差别,所以我并不能肯定,我建立的 TCP 的数据一定说明问题,只是同样出
自我手的两个测试的结果差异很大,令我对协议产生了自己的观点而已。
 
UDP广播是可以的!不过你可以将其它20台设置在另一个工作组中!!程序对10台计算机进行广播,工作组一样!!简单代码如下:客户端端口号设为:9080
{接收端}
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
MyStringList: TStringList;
str: String;
begin
MyStream := TMemoryStream.Create;
MyStringList := TStringList.Create;
NMUDP1.ReadStream(MyStream);
MyStream.Position := 0;
MyStringList.LoadFromStream(MyStream);
str := Trim(MyStringList.Text);
if str = '严春意' then
ShowMessage('成功');
MyStringList.Free;
MyStream.Free;
end;

{发送端}
procedure TForm1.Button1Click(Sender: TObject);
var
MyStrList: TStringList;
MyStream: TMemoryStream;
vStr: String;
begin
MyStrList := TStringList.Create;
MyStream := TMemoryStream.Create;
MyStrList.Add(Edit3.Text );
vStr := Trim(MyStrList.Text);
MyStream.Write(vStr[1], Length(vStr));
NMUDP1.RemoteHost := '192.168.1.3';//这是对一台计算机发送,如广播请用: 192.168.1.255
NMUDP1.RemotePort := 9080;//客户端端口号
Form1.NMUDP1.sendstream(MyStream);
MyStream.Free;
MyStrList.Free;
end;

还有问题请发信:yanchunyi@163.com,我可以提供例子
 
多谢小雨哥和春意兄,春意兄的办法在实现我觉得有困难,本来就是一个局域网的机器,而且并不是限制某十台能用,另外20台不能用,而是随机的,谁先来,谁就能用啊,所以分组恐怕解决不了,能否再帮小弟想想?多谢了。
 
噢,对了,大资料包的传输问题是不是可以不考虑广播传送。比如常有这方面的任务,考虑
在客户端中加入指令系统,指示客户端自己去一个位置取货。
 
多谢各位,问题虽然还有疑问,但不拖了,就此给分,再谢小雨哥和春意兄的点播,我的mail:fongwei0@163.com,qq:32086751,希望两位能给留个联系方式,日后交流,谢谢。
 
后退
顶部