C# 即时通讯软件开发

.Net技术 码拜 9年前 (2015-05-10) 1746次浏览 0个评论

现在用C#做一个即时通讯软件,客户端和服务器端都用C#,需要是在公网和内网中都能使用。其中包含文件传输、视频、语音聊天,这几个功能最好是通过P2P技术来实现,不要通过服务器转发。

如果客户端在不同的网段中,互相之间发送消息,如果不通过服务器转发就要考虑NAT打洞,用socket可以实现,但是各种异常处理及打洞过程都要自己写代码实现,比较麻烦。

看了WCF的介绍,WCF提供双工模式,服务器端和客户端可以直接通讯,但是不知道用WCF能不能实现两个客户端之间的直接通讯,望赐教。如果可以实现,就能省去很多socket编程的细节处理。

另,有那位高手知道C#下,有那些可以使用的即时通讯框架或相关技术,不想自己用socket来实现,关键是要能实现NAT穿透就可以。

找腾讯给你源代码

4分
如果你想开发一个互联网IM(而不是仅限于局域网的IM),你用“服务器转发方式”做过能够应付上百人自由聊天的IM吗?做了之后,在纠结什么p2吧!

wcf是面向业余开发人员进行了巨大的封装的一个东西,跟tcp(或者socket之类)的不能直接相比。而且不管有些人如何介绍wcf的实现方法,实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。你把它看作什么socket的替代,这完全看不出来什么前途。

3分
,在纠结什么p2吧  –>  ,再纠结什么p2p吧

对于没有能讨论具体问题的程序员,我也确实没有什么代码可给你的。只是介绍给你一些非常实际的背景知识。

3分
P2P也要实现一个检索服务器啊。。。
我现在已经做了一个 版本的IM,原先都一直在同一网段的局域网下进行测试的,p2p文件传输也都正常。

但是在两个不同网段的局域网上测试,根本就联不通,别的就都谈不上了,

搜了一下,相关的资料,好像只能通过架设在公网上的server服务器中转打洞才能实现不同网段局域网的互通,但打洞过程很负责,有很多情况都需要处理,所以想,如果能找到 已经开发好的框架就最好了

3分
引用 5 楼 garfield21 的回复:

我现在已经做了一个 版本的IM,原先都一直在同一网段的局域网下进行测试的,p2p文件传输也都正常。

但是在两个不同网段的局域网上测试,根本就联不通,别的就都谈不上了,

搜了一下,相关的资料,好像只能通过架设在公网上的server服务器中转打洞才能实现不同网段局域网的互通,但打洞过程很负责,有很多情况都需要处理,所以想,如果能找到 已经开发好的框架就最好了

那就不要打洞了。你还是直接用TCP中转吧。

引用 2 楼 sp1234 的回复:

如果你想开发一个互联网IM(而不是仅限于局域网的IM),你用“服务器转发方式”做过能够应付上百人自由聊天的IM吗?做了之后,在纠结什么p2吧!

wcf是面向业余开发人员进行了巨大的封装的一个东西,跟tcp(或者socket之类)的不能直接相比。而且不管有些人如何介绍wcf的实现方法,实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。你把它看作什么socket的替代,这完全看不出来什么前途。

谢谢你的解答,那就是说wcf是不可能替代Socket的,那我也只能是通过Socket来实现各个功能了吧?

2分
两边都是内网,必须借助服务器,和wcf或者socket无关。
4分
WCF里面有个叫网格网络的东西,就是用来做P2P的。
不过性能问题很大,基本上是个玩具吧。
那是不是说,要想做IM,还是得用socket,用wcf是不行的,我是向做成一个产品的

你都开发出来了,还来论坛问。。。不待这么玩人的。。
http://download.csdn.net/detail/garfield21/6854477

2分
引用 11 楼 garfield21 的回复:

那是不是说,要想做IM,还是得用socket,用wcf是不行的,我是向做成一个产品的

如果你有兴趣的话,可以试试fastCSharp的TCP调用,在基本不损失性能的情况下屏蔽了socket操作,简单易用比WCF更方便灵活。

2分
一般来说能过做到有效利用公网用户有很不错了,NAT穿透可以等这一块成熟了再扩展。
2分
打洞什么的别想了,好好通过服务器转发吧,试试你就知道 只要代码写的好,高并发没问题
如果你不是要给全国人民使用的话,服务器转发就够了。
4分
Socket服务器这块的开源框架有个SuperSocket,再就是迅雷有个 云加速开放平台,直接调用迅雷接口,什么都不用写,利用迅雷的P2SP技术,当然只是针对下载网址是:http://open.xunlei.com/index.html
引用 15 楼 wangjun8868 的回复:

打洞什么的别想了,好好通过服务器转发吧,试试你就知道 只要代码写的好,高并发没问题

引用 16 楼 mjp1234airen4385 的回复:

如果你不是要给全国人民使用的话,服务器转发就够了。

如果用服务器中转用UDP还是TCP啊

4分
tcp就行。
引用 19 楼 mjp1234airen4385 的回复:

tcp就行。

TCP应该是长链接吧,这会影响效率吗?

4分
引用 20 楼 garfield21 的回复:

TCP应该是长链接吧,这会影响效率吗?

性能方面TCP长连接优于短连接,当时服务器需要多一点内存。

2分
难道,你想等到用户要发言的时候,才连接服务器。
7分
那个…有个叫IPMSG的软件,代码是公开的可以下载,我记得是使用UDP通信的,把这个软件的代码改一改,不知道是否可行?

另外:关于”sp1234″说的 WCF “实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。”,
说法是不是略显得武断了?我曾经开发过使用WCF的Service,是采用NetTcpBinding通信方式,不过没有做过大并发连接测试,几十个客户端的连接还是可以的

引用 25 楼 yanran_hill 的回复:

那个…有个叫IPMSG的软件,代码是公开的可以下载,我记得是使用UDP通信的,把这个软件的代码改一改,不知道是否可行?

另外:关于”sp1234″说的 WCF “实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。”,
说法是不是略显得武断了?我曾经开发过使用WCF的Service,是采用NetTcpBinding通信方式,不过没有做过大并发连接测试,几十个客户端的连接还是可以的

局域网跟互联网完全两个概念。。。

IPMSG  内网的,这个不一样的,内网直接通过内网IP访问就可以的
引用 24 楼 mjp1234airen4385 的回复:

难道,你想等到用户要发言的时候,才连接服务器。

如果用UDP实现,连接上服务器后,就断开了。

发消息时,用UDP发送完消息后,也就自动断开了

6分
TCp通讯暂时是最好的一个方法,我最近也在搞一个网络通讯,搞出来可以拿来给大家点评点评
4分
引用 28 楼 garfield21 的回复:
Quote: 引用 24 楼 mjp1234airen4385 的回复:

难道,你想等到用户要发言的时候,才连接服务器。

如果用UDP实现,连接上服务器后,就断开了。

发消息时,用UDP发送完消息后,也就自动断开了

UDP用来广播还差不多,如果需要保证消息的必须接受到,我建议使用TCP

UDP通讯  服务器和客户端 互相通讯的已经好了。

现在在看UDP打洞的资料

4分
WCF就是一个玩具,性能较弱,做产品,还是老老实实用Socket好了。
4分
.net 4.5好像封装了一个P2P的类
2分
GG2013给你一切所需
GG2013-外网仿QQ通讯
很不错  很好很强大哦    真的神使用    快来微观
4分
先用着服务器转发吧,搞懂了再研究P2P就容易了
2分
引用 26 楼 hudsonhuang 的回复:
Quote: 引用 25 楼 yanran_hill 的回复:

那个…有个叫IPMSG的软件,代码是公开的可以下载,我记得是使用UDP通信的,把这个软件的代码改一改,不知道是否可行?

另外:关于”sp1234″说的 WCF “实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。”,
说法是不是略显得武断了?我曾经开发过使用WCF的Service,是采用NetTcpBinding通信方式,不过没有做过大并发连接测试,几十个客户端的连接还是可以的

局域网跟互联网完全两个概念。。。

IPMSG也是可以跨网的

4分
引用 7 楼 garfield21 的回复:
Quote: 引用 2 楼 sp1234 的回复:

如果你想开发一个互联网IM(而不是仅限于局域网的IM),你用“服务器转发方式”做过能够应付上百人自由聊天的IM吗?做了之后,在纠结什么p2吧!

wcf是面向业余开发人员进行了巨大的封装的一个东西,跟tcp(或者socket之类)的不能直接相比。而且不管有些人如何介绍wcf的实现方法,实际上靠谱的也就是在http上进行封装(变大而且变慢了几倍)的结果。你把它看作什么socket的替代,这完全看不出来什么前途。

谢谢你的解答,那就是说wcf是不可能替代Socket的,那我也只能是通过Socket来实现各个功能了吧?

这个家伙,有点水平,就是说话不大好听。

另外,WCF的性能确实是一个问题。

2分
路过帮顶,学习下
6分
引用 35 楼 u013402605 的回复:

.net 4.5好像封装了一个P2P的类

.net很早就封装了,但是要依赖windows的一个组件(不是所有的windows都支持,而且要人手启动)
还要有一个索引服务器

4分
要即时通讯,还是老实的用socket吧,WCF那东西没法
4分
我其实挺奇怪飞秋(feiQ)这个软件的
它不是基于UDP的吗?比如查找谁在线,很显然是发了个广播出去,然后收听
否则也没可能在4秒之内遍历所有的网段去连接一遍吧
可是,广播不是会被路由器屏蔽么,为什么不同网段也能够在线查找到呢?
4分
引用 44 楼 Z65443344 的回复:

我其实挺奇怪飞秋(feiQ)这个软件的
它不是基于UDP的吗?比如查找谁在线,很显然是发了个广播出去,然后收听
否则也没可能在4秒之内遍历所有的网段去连接一遍吧
可是,广播不是会被路由器屏蔽么,为什么不同网段也能够在线查找到呢?

他一开始出来是仿飞鸽传书,不知道现在有没有自己扩展协议,不过日本人写的飞鸽传书的协议是公开的,你可以搜索下。

4分
引用 45 楼 u011048876 的回复:
Quote: 引用 44 楼 Z65443344 的回复:

我其实挺奇怪飞秋(feiQ)这个软件的
它不是基于UDP的吗?比如查找谁在线,很显然是发了个广播出去,然后收听
否则也没可能在4秒之内遍历所有的网段去连接一遍吧
可是,广播不是会被路由器屏蔽么,为什么不同网段也能够在线查找到呢?

他一开始出来是仿飞鸽传书,不知道现在有没有自己扩展协议,不过日本人写的飞鸽传书的协议是公开的,你可以搜索下。

查看了一下协议的简介,没有看源码.百度文库里给的简介,说的就是发送广播.
我只是在奇怪为什么广播能够跨网发送.
我们有个核心交换机,上面分了9个VLAN,都是不同的网段,按理说广播到核心交换那里应该就终止了,不会转发到其他网段里去啊.
也有可能是核心交换里做了什么设置,让特定端口的广播允许转发了?

谢谢大家的意见,现在还是决定先用服务器转发,这个是一定要做的,等这个搞好了再说吧
即时通讯我就知道一个xmpp

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 即时通讯软件开发
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!