==========================================================================
Dolphin项目简介
Dolphin是一款免费的自由软件,它将会在GPLv3协议下被发布,任何组织或者个人
都可以在遵循GPLv3的基础上,修改Dolphin的代码来定制适合自己的通讯软件。
日本有一座海豚纪念雕像,纪念一只名叫奥罗的海豚。奥罗曾帮助当地渔民确定鱼
群所在的位置并带领渔民避开浅滩。
无独有偶,在新西兰也有两座海豚纪念雕像。其中一只海豚是领航员,它24年如一
日兢兢业业地工作,把不计其数的轮船从礁石险滩中带到了安全地带。另一只海豚
非常喜欢和人类玩耍。
我们的自由软件就如这些充满友爱的海豚,从人们认识它们的那一刻起,就在为了
自己的大爱,默默地为别人做贡献。海豚的超声波通讯方式,也像我们这款软件一
样,要在无尽的大海中,找到自己的朋友……
因此,我们的软件取了Dolphin这个名字。
我们选择了Qt4作为我们的开发工具。首先,因为C++是一种高效的语言,我们不必
为服务器端的效率而担忧。其次,Qt经过多年KDE开发的考验,已经相当成熟和健
壮了,而且可移植性非常好。此外,Qt4是在GPLv3协议下发布,这样,在法律上我
们不会遇到任何麻烦。软件中所有的通讯协议和基本构架,都将由我们在Qt4的基
础之上自主开发,我们不会参照任何专有软件的源代码和协议,当然,我们也不会
和诸如飞鸽传书等任何类似软件进行兼容。
在思想上,我们的目的在于给用户这样一种自由:任何用户都可以建立自己的聊天
服务器,他们可以自由的控制或限制登录到自己服务器上的所有客户端。而且,我
们将尽力而为地提供通讯的安全保证。
Dolphin具有如下的优点主要具有以下功能:
1.只要有一台具有公网IP的服务器,每个客户端都可以直接与所有能够连接到
Internet上的其他客户端进行通讯,这也就是说,Dolphin可以穿透NAT进行P2P通讯。
2.服务器是低负荷的。考虑到多数普通用户较难提供高性能服务器的现实,我们所
设计的服务器是低负荷的。服务器只是负责在有新用户加入(或退出)时通知其他
在线用户,至于客户端之间的通讯则是典型的P2P模式。
3.客户端之间可以发送和接受文本消息和图片,并能够高速地传输文件。
我们当前所面临的技术难点:1.如何有效地穿透NAT进行通讯;2.如何高速地实现
文件传输功能;3.如何自行对UDP数据报的收发情况进行容错检验。
限于我们的技术,我们目前只计划做这些事情,但是,我们很欢迎也很希望其他对
此有兴趣的开发人员加入我们,帮助我们,让我们一起把它做得更好。
====================================
======
我现在就尝试着将其翻译成英文,免得我直接写成陕西英语大家看不明白。
希望大家帮助,谢谢!
Dolphin project profiles
Dolphin is a free free software, it will be in the GPLv3 released under
the agreement, any organization or individual can be followed in the
GPLv3 on the basis of Dolphin amend the code to customize the software
for their own communications.
Japan has a statue commemorating the dolphins, the dolphins to
commemorate a Mingjiaoaoluo. Yuluo help local fishermen have identified
the location of fish and fishermen led avoid shoals.
Coincidentally, in New Zealand also have two dolphins Memorial statue.
Navigator which is a dolphin, as long as its 24 dedicated work of the
countless vessels from the rocky shoals of taken to a secure location.
Another dolphin love and human play.
Our free software such as full of love dolphins, it is recognized from
the moment they start on their own in order to love silently for others
to make contributions. Ultrasonic dolphin communication, as we have the
software, in the endless sea, find their friends……
Therefore, our software from the Dolphin name.
We have chosen Qt4 as our development tools. First of all, because C + +
is a highly effective, and we do not have the efficiency of the server
to worry about. Secondly, after years of Qt KDE development of the test
has been quite mature and robust, and portability very good. In
addition, Qt4 in GPLv3 is released under the agreement, so that in law
we will not face any trouble. All of the communications software and
basic framework of the agreement, we Qt4 will be on the basis of
self-development, we will not refer any proprietary software and the
source code of an agreement, of course, we would not like Dove and any
similar-books software compatibility.
Ideologically, and our aim is to the user of such a freedom: any user
can create their own chat server, they can control or restrict the
freedom of their own server log of all client. Moreover, we will do our
best to provide communications security assurances.
Dolphin has the following main advantages are the following features:
1. As long as there is a public IP network server, each client can
directly connect to the Internet to all the other client communications,
that is to say, a Dolphin could penetrate NAT P2P communications.
2. Server load is low. Considering that most ordinary users more
difficult to deliver high-performance server reality, and we designed
the server load is low. Server is responsible for a new user to join in
(or out), notify the other online users, as for communication between
the client is a typical P2P model.
3. Between the clients,users can send and receive text messages and
pictures, and are able to transmit high-speed document.
We faced by the current technical difficulties: 1. How to effectively
communicate through NAT 2. How to achieve high-speed file transfer
function; 3. How self-reported data on UDP situation fault-tolerant
transceiver test.
Limited to our technology, we currently only has plans to do these
things, but we also very much welcome this very much hope that other
interested developers to join us, help us, let us put it better.
“1.只要有一台具有公网IP的服务器,每个客户端都可以直接与所有能够连接到
Internet上的其他客户端进行通讯.”
服务器必须在公网上。
现在我们自己在家上网都有一个公网IP,不过没隔2小时左右就会改变一次。
我听建军说过,可以申请动态域名,没10分钟左右更新一次。如果普通用户需要的话,可以使用动态域名。客户端可以使用域名登录服务器,当然,这是未来用户们自己的事情。
>
> >
>
我起初所面向的用户是这样的:比如,在我们小组,我们可以要一个固定IP来作为
我们自己的服务器,我们其他同学不管在什么地方,都能够相互通讯。其他的组织
也可以像这样自己构架自己的即时通讯平台,而不必在依赖于QQ和MSN等工具。对
这些用户而言,使用Dolphin最大的好处就是:他们可以自己修改代码,为自己良
量身定制合适自己的平台,而不必受第三方组织在性能,功能和经济等方面的约束。
我觉个例子,我们不少同学在和企业签约后,都建了自己的QQ群。如果有了
Dolpin,他们完全可以自己构架和管理自己员工的行为和通讯。
对我们而言,可以学会很多知识,何乐而不为?
不过我现在最头疼的还是穿透NAT技术的问题,和压缩数据通讯问题。小金说深信
服那几个在线挑战,这个是最难的一个。
我在我们局域网里传输文件,目前为止,最快的就是使用smaba了,可以达到5M左
右,同样条件下,QQ只有500KB/s,这么看我们还有是很大发挥空间的。
那些都是机器翻译的?太不可思议的智能化了!
--
====================================
这些墙很有趣。刚入狱的时候,你痛恨周围的高墙;慢慢地,你习惯了生活在其中;最终你会发现自己不得不依靠它而生存。这就叫体制化。
just do it !
====================================
我明白你的意思了,你就是说在内网里要让客户端自动搜出Server,来使用户更加
方便使用,是吗?
但是,如果集成到一起,那么每个客户端都是一个独立的Server,如何决定使用哪
个作为公共的Server呢?
> 不过一般情况是一个用户正常退出,这时我们可以让它主动向所有
> 在线用户发送通知信息。
>
如果这个用户不是正常退出的呢?比如掉线、死机等情况发生?
如果集成到一起,能够想个好的算法让每个用户自己在内网寻找大家公认的
"Server",而此Server如果遇到异常,用户能够自己找到一个后备的Server来继续
保持连接(这一切对用户来讲都是透明的),那样的话的确是个好主意。
但是,外网的情况怎么办?而且要找到这个内网Server不是还要广播么?
传统的CS模式都要求所有客户端都事前知道一个固定的Server地址和Port,我们这
种想法却不要求用户知道一个“周知IP地址”是不是太离经叛道了?
>
>
>>> {snip}
>>>
>>>
>>>
>>>>>> 我觉得你说的也很有道理,我再仔细考虑一下,尽快给大家回复。
>>>>>>
>>>>>> 不过我现在最头疼的还是穿透NAT技术的问题,和压缩数据通讯问题。小金说深信
>>>>>> 服那几个在线挑战,这个是最难的一个。
>>>>>>
>>>>>>
>>>>>>
>>>>> 我们可以先不考虑穿透nat。
>>>>>
>>>>>
>>>>>
>>>> 那就按赵崇日说的,先只做内网部分?我只是担心这种设计结构和穿透外网时所用
>>>> 到的不同。
>>>>
>>>>
>>> 我不认为。
>>>
>>>
>> 广播式的内网模式是纯粹的P2P模式,而我所谓的外网模式是典型的CS模式。各个
>> 用户之间的联系由服务器来帮助他们统一建立。
>>
>
>
> 你那个外网模式太不方便了。
>
{snip}
> >>>>> 需要单独的服务器端??不是把服务器和客户端集成到一起吗?
如果在内网那个里,集成当然可以,如果用于外网,那就难了。如果用户太多,服务器的负荷就比较大了。而且服务器的稳定性、可靠性都不容易保证。
>
> 那就按赵崇日说的,先只做内网部分?我只是担心这种设计结构和穿透外网时所用
> 到的不同。
> 大家的意思呢?
我觉得这要我们实验测试把那两个问题解决了,然后设计一下整个程序的构架。
如果内外网差异较大,那我们就得考虑直接做外网。
--
| Jianjun Kong | www.kongove.cn
| Xi'an Institute of Post & Telecommunications
此外,服务器端还可以根据自己的需要来组织、管理自己的用户。比如,我们小组
可以建立一个Server,把参加各个项目的同学分开来,让每个小群的同学可以以会
议的形式发送消息,而其他项目组的人看不到。
这就是我的初衷。
相对于飞鸽的优势是:飞鸽只能在一个内网,而当我回家时,我也可以和同学们一
起参与我所想参加的项目,只要有一个开放的Server。我想,对于大多数企业和组
织,搞一个Server应该不是难事,在我们实验室,弄一个工作时间能够开放的
Server也不是问题吧。
最有趣的是,这些东西都可以由我们来自由管理。
> >
>
小组实验室分配的应该算是外网IP
> > > 怎么越感觉越像IRC??
> > >
> > 是有点像IRC,但是比IRC更全面些:比如传输文件,发送图片,我们可以定制自己
> > 的群(当然,这是以后可以扩展的功能)。
> > 我就是想给所有用户可以建立自己群体聊天服务器的自由。
>
>
> IRC也有“群”,只是它不这么叫,它叫“频道”。
>
>
> > 再说得直白点:我们就是想做个QQ的模式,让其他用户自己管理他们的Server。
> > 使用具有独立IP的服务器是公网通信的唯一途径,我实在想不出别的办法能在公网
> > 上让用户随意通信。
>
> 恩,问题是这样能比QQ或者gtalk好多少?别只说服务器可定制啊,用户
> 只关心用着方便,他们才不管服务器如何呢。
EVA的文件传输很不好用,别说速度了,有时根本没反应。Gtalk的文件传输没用过,不太清除。
三楼实验室只有一个外网IP,其他是196.168.*.*的内网(好像好多开放实验的实验室都是这样)。那可能存在问题。
434不存在这个问题。
我去年用自己电脑做过一次web服务器,没有任何没问题。不过学校把一大堆端口封了~~~
至于老师那样说?可能不知道实验室具体情况~~
> > > > 是有点像IRC,但是比IRC更全面些:比如传输文件,发送图片,我们可以定制自己
> > > > 的群(当然,这是以后可以扩展的功能)。
> > > > 我就是想给所有用户可以建立自己群体聊天服务器的自由。
> > >
> > >
> > > IRC也有“群”,只是它不这么叫,它叫“频道”。
> > >
> > >
> > > > 再说得直白点:我们就是想做个QQ的模式,让其他用户自己管理他们的Server。
> > > > 使用具有独立IP的服务器是公网通信的唯一途径,我实在想不出别的办法能在公网
> > > > 上让用户随意通信。
> > >
> > > 恩,问题是这样能比QQ或者gtalk好多少?别只说服务器可定制啊,用户
> > > 只关心用着方便,他们才不管服务器如何呢。
> >
> > EVA的文件传输很不好用,别说速度了,有时根本没反应。Gtalk的文件传输没用过,不太清除。
> >
>
> ok. 那你应该去改进eva,而不是从头再发明一遍。
EVA得不停的跟着腾讯走。
关于这个,梅延涛已经说过。我们要在速度(相对QQ)和穿透NAT(相对飞鸽)上体现优势,还有梅延涛讲的定制自己的通讯工具等。
我希望穿透NAT是想把他放到公网上去使用,此外,穿透NAT现在其实也已经是一件
很普遍的技术了,但是教材上提到的寥寥无几,我觉得值得我们自己去学习。
在内网中的Server应该也可以充当外网的服务器,我正在学习这种技术,相信很快
会有解决方案。
谢谢大家的帮助,欢迎再提意见,多改改就更好了。
最重要的是,我们能够学习到如NAT等很多网络编程知识。
封端口有些直接在路由器等上面实现。管你什么IP,数据总得从学校那个口出吧。
这得问一下明洁,他们公司就搞这个。
> >
> >> 至于老师那样说?可能不知道实验室具体情况~~
> >>
> >
> > 学校是不会给你一个固定的外网ip的。
> >
> 我说过,我们家就是独立IP,可以使用动态域名来解决代替固定IP问题。这个孔建
> 军弄过。
这个得考虑一些特殊情况,比如现在新校区宿舍,就不能用动态域名了。
curl -su stallmans:passwd 'http://members.3322.org/dyndns/update?system=dyndns&hostname=kongove.3322.org' & > /dev/null &
本来执行上面的命令就可以。 也不能对外开FTP了。
> >
> >
> >>>> EVA的文件传输很不好用,别说速度了,有时根本没反应。Gtalk的文件传输没用过,不太清除。
> >>>>
> >>>>
> >>> ok. 那你应该去改进eva,而不是从头再发明一遍。
> >>>
> >> EVA得不停的跟着腾讯走。
> >>
> >
> > 我们不跟腾讯走,那我们自己去开个公司??
> >
> 我觉得王聪兄这句话很奇怪,你是鼓励我们跟腾讯兼容吗?
> >
> >
> >> 关于这个,梅延涛已经说过。我们要在速度(相对QQ)和穿透NAT(相对飞鸽)上体现优势,还有梅延涛讲的定制自己的通讯工具等。
> >>
> >>
> >
> > 要速度,gtalk不慢吧?
> >
> > 要穿透NAT,现在梅同学的解决方法是用qq的方式,那和gtalk有啥两样??
> >
> 这个不是QQ的方式,国外对于此问题的讨论有很多好文章,为什么说是QQ的方式?
> > 另外,请定义你们的“定制自己的通讯方式”。
> >
> 在这个项目的基础上,我们可以扩展很多功能(当然,目前我们还不具备这种技术
> 能力):
> 服务器端可以自己定制自己允许登录的用户(身份验证),管理员可以监督会话
> (如不许用户工作时间聊与公所无关的,违法的,色情的,反动的话题),组织和
> 管理用户(把不同部门的用户分群),特定用户有群发能力(老板说话,大家都
> 听),监督用户是否在机器前(可以随机提问,看用户是否及时回答),特定用户
> 可以监视其他用户屏幕(老板客户端看用户有没有进行与工作无关的娱乐活动),
> 提高安全性(使用SSL等库)等等。
--
从我个人的角度来讲,我对Server模式充满了渴望,因为Server是实现众多“控制
性功能”的前提。
下面这个我正在翻译:
http://www.linuxjournal.com/article/9004
这个还没仔细看,希望有参考价值:
http://www.ietf.org/proceedings/00dec/slides/MIDCOM-3/sld005.htm
在google里还可以搜到许多邮件列表的信息,我就不例举了。
>
>
>>> 另外,请定义你们的“定制自己的通讯方式”。
>>>
>>>
>> 在这个项目的基础上,我们可以扩展很多功能(当然,目前我们还不具备这种技术
>> 能力):
>> 服务器端可以自己定制自己允许登录的用户(身份验证),管理员可以监督会话
>> (如不许用户工作时间聊与公所无关的,违法的,色情的,反动的话题),组织和
>> 管理用户(把不同部门的用户分群),特定用户有群发能力(老板说话,大家都
>> 听),监督用户是否在机器前(可以随机提问,看用户是否及时回答),特定用户
>> 可以监视其他用户屏幕(老板客户端看用户有没有进行与工作无关的娱乐活动),
>> 提高安全性(使用SSL等库)等等。
>>
>
> 你越说越像qq,上面好几个功能都是qq有的。我是没体会到有多少自己的特色。
>
> 另外,既然没这技术还做个啥?!
>
不都是为了学习么……而且,我上面的话只是想说明这种模式的可扩展性很强。
我下面准备改进程序测试,客户端发送数据后,等待服务端使用获得的IP、Port向客户端传送数据。
服务端显示:
[crystallight]$ java J_UdpServer
Client Adr = 221.11.20.10at Port44550:Hello
Client Adr = 221.11.20.10at Port45558:Hello
Client Adr = 221.11.20.10at Port45593:Hello
Client Adr = 221.11.20.10at Port45656:Hello
Killed
[crystallight]$
客户端显示:
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient
Wed Mar 12 21:45:35 PST 2008
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient
Wed Mar 12 21:45:37 PST 2008
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient
Wed Mar 12 21:45:38 PST 2008
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient
Wed Mar 12 21:45:39 PST 2008
--------------------------------------------------------------------
import java.net.*;
import java.io.*;
import java.util.Date;
public class J_UdpServer{
public static byte[] mb_getTime(){
Date d = new Date();
return d.toString().getBytes();
}
public static void main(String aargs[])
{
DatagramSocket dSocket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress cAddr;
int cPort;
byte[] inBuffer = new byte[100];
byte[] outBuffer;
String s;
try{
dSocket = new DatagramSocket(8000);
while (true){
inPacket = new DatagramPacket(inBuffer, inBuffer.length);
dSocket.receive(inPacket);
cAddr = inPacket.getAddress();
cPort = inPacket.getPort();
s = new String (inPacket.getData(), 0, inPacket.getLength());
System.out.println("Client Adr = " + cAddr.getHostName() +
"at Port" + cPort+":" + s);
outBuffer = mb_getTime();
outPacket = new DatagramPacket(outBuffer, outBuffer.length, cAddr, cPort);
dSocket.send(outPacket);
}
}
catch(IOException e){
System.out.println("IOException occurred with socket.");
System.out.println(e);
e.printStackTrace();
}
}
}
--------------------------------------------------------------------
import java.net.*;
import java.io.*;
public class J_UdpClient{
public static void main(String args[]) throws IOException
{
DatagramSocket dSocket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress sAddr;
byte[] inBuffer = new byte[100];
byte[] outBuffer;
String s = "Hello";
try{
dSocket = new DatagramSocket();
sAddr = InetAddress.getByName("www.kongove.cn");
outBuffer = s.getBytes();
outPacket = new DatagramPacket(outBuffer, outBuffer.length, sAddr, 8000);
dSocket.send(outPacket);
inPacket = new DatagramPacket(inBuffer, inBuffer.length);
dSocket.receive(inPacket);
s = new String(inPacket.getData(), 0, inPacket.getLength());
System.out.println(s);
dSocket.close();
}
catch (IOException e){
System.out.println("IOException occurred with socket.");
System.out.println(e);
e.printStackTrace();
}
}
}
所以还得服务器。
先运行服务端(S),当客户端一(C1)向S发送数据时,S调用方法得到与C1通信的主机名(IP)、Port。然后客户端二(C2)通过S的到的主机名(IP)、port发送数据与C1通信。
我在本地试了一下,可以。S得到的主机名localhost、port:37332,C2可以通过这个向C1发送数据。
但我发S放到我的网站主机上。S得到的是221.11.20.10 Port:38565 ,C2利用这个却不能向C1发数据。
C1与S通信靠的就是S的到的IP和端口,为什么不能通信呢?我再到实验室试试。
先运行s,在运行C1(自动向S发送hello),在运行C2(后边带S得到的IP和端口作为参数)
------------------------------------------本地运行效果:
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpServer
Client Adr = localhostat Port32771:Hello
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient localhost
ECHO:Write111111111111
ECHO:Write222222222222
ECHO:Write333333333333
kongove@kongove-desktop:~/Desktop/pigeons/Java$ java J_UdpClient2 localhost 32771
Write111111111111
Write222222222222
Write333333333333
---------------------------------------------Server Code
import java.net.*;
import java.io.*;
import java.util.Date;
public class J_UdpServer{
public static byte[] mb_getTime(){
Date d = new Date();
return d.toString().getBytes();
}
public static void main(String args[])
{
DatagramSocket dSocket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress cAddr;
int cPort;
byte[] inBuffer = new byte[100];
byte[] outBuffer;
String s;
try{
dSocket = new DatagramSocket(8000);
while (true){
inPacket = new DatagramPacket(inBuffer, inBuffer.length);
dSocket.receive(inPacket);
cAddr = inPacket.getAddress();
cPort = inPacket.getPort();
s = new String (inPacket.getData(), 0, inPacket.getLength());
System.out.println("Client Adr = " + cAddr.getHostName() +
"at Port" + cPort+":" + s);
}
}
catch(IOException e){
System.out.println("IOException occurred with socket.");
System.out.println(e);
e.printStackTrace();
}
}
}
------------------------Client1 Code
import java.net.*;
import java.io.*;
public class J_UdpClient{
public static void main(String args[]) throws IOException
{
DatagramSocket dSocket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress sAddr;
byte[] inBuffer = new byte[100];
byte[] outBuffer;
String s = "Hello";
try{
dSocket = new DatagramSocket();
sAddr = InetAddress.getByName(args[0]);
//sAddr = InetAddress.getByName("192.168.44.35");
//sAddr = InetAddress.getByName("www.kongove.cn");
/*BufferedReader Buf = new BufferedReader(new InputStreamReader(System.in));
s = Buf.readLine();*/
outBuffer = s.getBytes();
outPacket = new DatagramPacket(outBuffer, outBuffer.length, sAddr, 8000);
dSocket.send(outPacket);
while(true){
inPacket = new DatagramPacket(inBuffer, inBuffer.length);
dSocket.receive(inPacket);
s = new String(inPacket.getData(), 0, inPacket.getLength());
System.out.println("ECHO:" + s);
}
//dSocket.close();
}
catch (IOException e){
System.out.println("IOException occurred with socket.");
System.out.println(e);
e.printStackTrace();
}
}
}
---------------------------------
import java.net.*;
import java.io.*;
public class J_UdpClient2{
public static void main(String args[]) throws IOException
{
DatagramSocket dSocket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress sAddr;
byte[] inBuffer = new byte[100];
byte[] outBuffer;
String s = "Hello";
int port = Integer.parseInt (args[1]);
try{
dSocket = new DatagramSocket();
sAddr = InetAddress.getByName(args[0]);
//sAddr = InetAddress.getByName("221.11.20.10");
//sAddr = InetAddress.getByName("www.kongove.cn");
while(true){
BufferedReader Buf = new BufferedReader(new InputStreamReader(System.in));
s = Buf.readLine();
outBuffer = s.getBytes();
outPacket = new DatagramPacket(outBuffer, outBuffer.length, sAddr, port);
dSocket.send(outPacket);
}
//dSocket.close();
是的,现在宿舍上网都要通过 221.11.20.10
老大弄的那个动态域名也用不了了,SSH、FTP、WEBServer……基本上全完蛋了。。
自动获得的那个子网IP,掩码居然是255.255.255.255~~