如何利用C#和socket做出一个类似QQ的聊天软件

如何利用C#和socket做出一个类似QQ的聊天软件,第1张

大概说说吧,细节跟代码真不是三两行的事就不多提:

方案一:

TcpClient与Tcplistenler来完成服务器与客户端之间的交互,后面的事情交给UDP,采用最原始最古老、最麻烦的技术、UDP穿透NAT使客户端与客户端建议连接机制完成后续的消息传递。

其中还有点相对“打洞”简单但是又比较麻烦的是TCP的粘包处理。

方案二:

简单好处理,缺点是对服务器的要求更高。

客户端彼此之间不产生交互,通过webclient、web>

首先,你应该了解一下使用WCF方法异步(特指使用代理工具生成Begin/EndXXX异步方法)时Begin和End方法的特性。

BeginAdd在执行时并不会阻塞线程,它会立即返回一个IAsyncResult同步对象,该对象是受同步保护的内存块,会跨越一切困难维持着自身的一致性。当然,如果传入了一个回调方法(你的AddCallBack),则BeginAdd开始执行时会在调用方偷偷建立一个线程以等待同步信号,当服务端的Add方法执行完毕后本地线程会调用该回调。

再说EndAdd。此方法实际上是作为一种“保险”来使用,而非你的EndAdd(BeginAdd())这样。EndAdd是会阻塞线程的方法,实际的意义是“等待到Add方法结束并返回”。如此,你应该可以理解注释掉的

ConsoleWriteLine(scEndAdd(scBeginAdd(1, 2, 1000, null, null)));

是如何工作的了:

首先sc要求服务端异步执行Add方法且无回调,BeginAdd立即返回,但是EndAdd又要求等待至服务端Add结束。综上,此行代码其实等同于ConsoleWriteLine(scAdd(1,2,1000));

(这里顺便说一句,如果传入了一个回调,在回调开始执行的同时EndAdd也返回了)

那么

//为什么用这两行代码,最后GetOperateCount的结果是2

         

ConsoleWriteLine(scEndAdd(scBeginAdd(1, 2, 1000, null, null)));

             ConsoleWriteLine(scEndSub(scBeginSub(9, 4, 2000, null, null)));

因为其实你的代码都是“同步”的,先加,后减,然后“同步”GetOperationCount。

这一点是很容易验证的,比如你可以在以上两行后都加ConsoleWriteLine(scGetOperationCount());(此为同步方法)可以很明显的看出是先加后减的。

那么

//为什么用这两行代码,最后GetOperateCount的结果是0

         

IAsyncResult iaAdd= scBeginAdd(1, 2, 1000, AddCallback, sc);

            IAsyncResult iaSub = scBeginSub(1, 2, 1000, SubtractCallback, sc);

这个也很好理解,iaAdd和iaSub都被立即返回了,然后立刻”同步“打印了结果(scEndGetOperationCount(scBeginGetOperationCount())等同于scGetOperationCount())。

因为服务端方法执行需要时间,又或者是首次服务实例(你的服务InstanceContextModeSingle)实例化需要时间,很可能在服务端GetOperationCount方法会先于Add和Sub完成并返回,导致了输出为0。

这个也是可以验证的。

验证一:在GetOperationCount服务方法内加入

SystemThreadingThreadSleep(5000);

你会看到输出是正确的2,因为5秒内Add和Sub早已返回,连AddCallback和SubtractCallback都已执行完毕(从两个回调的输出可见)。

验证二:我们在服务端Add方法内延时1秒,在Sub方法内延时10秒,在GetOperationCount方法内延时5秒。猜猜看结果?先加再输出再减。(如果条件允许,请在三个服务方法上加断点,可以更好的观察到执行顺序)

以上为你的问题分析。这里我提个小小的建议:请按标准的做法来写程序。

如果需要同步执行,就直接执行同步方法;如果需要执行异步方法,请使用IAsyncResult及回调进行处理。End方法作为一种保险措施,是为了在本地已得知异步执行完毕后通知CLR释放相关资源所用,应该在你等待超过预期时间或者已经处理完异步结果后调用,通常End方法位于回调中,也有少数时间因为同步结果在其他地方处理因为挪到外部的情况。

异步有很多种实现方法,选择适合自己的一种。在不需要处理中间的过程数据时,我个人更喜欢下面的做法。至少省掉了生成异步方法的 *** 作。

ThreadPoolQueueUserWorkItem(()=>

{            double result = scSub(ar);            ConsoleWriteLine("Subtract Result : " + result);});

就这么多,有问题请PM。

wcf就是普通的文本文件,可以直接用写字板或者word打开。如果觉得不爽,可以直接把扩展名改为txt。

根据微软官方的解释,WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的、安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了Net平台下所有的和分布式系统有关的技术,例如Net Remoting、ASMX、WSE和MSMQ。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASPNET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,>

C++调用WCF

写的ServiceContract

一共有几种方式?

C++调用WCF

写的ServiceContract

一共有几种方式?我下面的调用方式虽然能访问但是不理想。

在创建C++工程时候选择

公共语言运行库支持(/clr)

可以添加WEB引用。

并且成功创建代理类。

也可以调用WCF提供的OperationContract具体方法。

但是有一个问题,由于以上 *** 作选择了

公共语言运行库支持(/clr)

,这样会不会要求C++客户端程序强制安装net

freamwork的托管运行环境。从而增加客户端的安装复杂性。

如果要求安装net

freamwork的托管运行环境,那么有什么好的方法可以不选择

公共语言运行库支持(/clr)

。或者不安装net

freamwork的托管运行环境,也可以使用WCF提供的

ServiceContract。

也就是C++调用WCF

写的ServiceContract

一共有几种方式?

小弟刚研究WCF不长时间,但是有WEBSERVICE基础(WEBSERVICE的安全也不会做),多谢各位前辈。

-----------------

大家有以下几种吧,

1直接调用,把WCF服务暴露为Web服务,如果C++可以直接调用Web服务,那么也可以直接调WCF服务。

2把WCF服务暴露为Rest

服务,C++如果可以调用普通的网页,通过>

本机telnet尝试一下端口先验证本机的服务是否正常,如果正常,在看客户机到服务器的网络是否正常,如果正常,再telnet尝试验证,如果端口不通,则可能是防火墙或杀毒软件之类软件阻止了端口通讯

很久以前,有一家小商店,靠卖些水果过日子。竞争是如此激烈,为了生存,他们不得不自己进货,把货堆到自己的房间内,如果顾客需要,他们有时还不得不给顾客送货,总而言之,他们将所有该干的活都干了,只为了能赚到点生活费,这就是艰辛的人生。

一个web程序或者一个winform程序,简单模式的程序,我们通常都如那个水果店的老板一样,把所有的功能都集中到这个程序里,在简单的状况下,这很好。

水果店生意越来越好,老板的资金慢慢雄厚了,他注意到了卖其他东西比卖水果更赚钱,比如说家电、服装。于是,老板一口气又开了几家店。生意规模越来越大,钱也越赚越多,老板心花怒放。然而好景不长,亚洲金融风暴来袭,利润率急剧下降。老板忧心忡忡,既然外部开源不太可能,那就看看内部能不能节流了。老板考察一番,注意到,为了销售,每个店都配置了一个仓库,每个店都配置了一帮送货的人马,这,是不是太浪费了。于是,老板将所有的仓库撤销,成立了一个总仓库,不管是水果,家店,服装,都可以存储到这个仓库。管理一个仓库的费用比管理N个仓库的费用显然是要少很多的。然后,每个店的送货人员都辞掉,另外成立一个运输公司,专门负责送货,不过水果还是家店还是服装,装到纸箱后,他们都是一个样。经过这么一折腾,成本一下就降了下来,而且还便于管理了,真是一举两得,老板又绽放了笑容。

当程序涉及的范围越来越大时,也许就要考虑将服务分离出去。WCF是应对分布式开发的,就如水果店老板,生意大了后,他就是个分布式的了,这边一家水果店,那边一家服装店,他们之间有区别,卖的东西不同,也有共性,都是卖东西,不管是哪家店,他们都需要仓库,都需要送货。这时,你就可以单独成立公司,只提供这两种服务。如果写成程序,那么就如同你开发了一个运输的WCF,把这个服务放在服务器上,这样不管是谁,是Web程序也好,是Winform程序也好,只要接口对应,理解你的服务内容条款(服务契约),都可以要求你这个服务模块提供标准的服务。

懒得写了,就这样。

以上就是关于如何利用C#和socket做出一个类似QQ的聊天软件全部的内容,包括:如何利用C#和socket做出一个类似QQ的聊天软件、求教关于c#的WCF的问题、wcf文件用什么能打开等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10140384.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存