最近开发一套员工计算机监控系统,遇到了网络通信方面的瓶颈,自己折腾了几天也没解决。
拜托各位大神不吝赐教。
切入正题:
我使用的是TCP/IP协议,用的是TcpListener和TcpClient这2个类来做网络通信。
程序中有多个窗体,有一个主窗体,主窗体上面是电视墙的形式,有很多个图片控件,每一个图片控件都有一个TcpClient,
然后获取了这个TcpClient的NetworkStream,每3秒循环读取客户端那边发送过来的屏幕截图,然后显示。现在又加了几个功能,就是获取客户端的当前运行进程,并在一个新的窗体中显示,还有向客户端发送消息等功能,每一个新功能都是一个新窗体,后面还陆续会增加功能。
在这个地方我不知道要怎么设计了。
单纯的一个主窗体,一个电视墙,一个连接,用着还很好使。
现在在新窗体中增加新功能了,要用到连接,如果把主窗体中的连接传递到新功能的窗体中去继续使用,读取客户端发送过来的数据,可能读取的是图片。或者其他别的数据,就乱了。
我想过,新窗体中再新建一个连接,但是又想到,连接太多了,会不会有性能问题,而且自己也感觉连接多了也不是很好控制,总体感觉是不够优雅,很乱。
所以请各位有这方面经验的大神不吝赐教。
万分感谢。
在线等待解答。

解决方案 »

  1.   

    补充提问:
    在网络通信中,通信的内容是不是也需要设计一番?
    我当前觉得如果不设计一番,NetworkStream里面读取的字节流很乱,不好处理,比如说图片的大小不确定,有的是100k,有的是200k不等的,而且网络速度也不可预料,有时会很好,有时会慢,对了,我是把图片序列化了以后发送的,每次都是循环发送,所以服务端这边接收的时候不知道应该接收多少字节才能成功反序列化一张图片,因此我就先发送一个数字到服务端,告诉服务端后面要接收多少字节的数据,这样才能完整成功的获取一次图片。不然服务端就不知道要读取多少字节。我这也算是粗略的设计吧,目前还好,但是后面功能多了,这方法我觉得肯定不顶用。各位经验大神还请不吝赐教多多传授经验啊。教一下我一般如何设计才好?
      

  2.   

    又一个BT的软件,每3秒发送一次算屏幕截图?如果计算机多了这种网络流量真的不少的,另外这种软件很容易被破,如果要监控的话,觉得还是想想其他折中的方法好了,如果你真的想要看屏幕,建议你看看VNC的源码,不过这个是C++的,这个能动态显示屏幕的变化.
      

  3.   

    感谢建议。
    我这个是局域网的,机器数量不是很多,也就十几台机器,我截图以后把图片缩小了,最后也就50kb左右了。
    开发这个东西主要是要锻炼一下自己。C#屏幕截图我觉得还好吧,就想要个这样的效果,我觉得低端不低端也无所谓了,能看见就好了。又不控制他的电脑,就是看一下他在干什么。
      

  4.   

    不是控制,而是参考一下VNC是如何实现反应对方机器屏幕变化的工作原理,这个应该不是通过传图片实现的.
      

  5.   

    谢谢耐心解答。
    去看VNC的源码我有困难,看不懂。
    我想得到一个网络通信的设计方案。
    大神,你有这方面的经验吗?还请不吝赐教。
      

  6.   

    1.对于协议,可以考虑采用TLV格式的协议,这个不懂可以百度.
    2.客户端最好只用一个Socket连接,所有的接收进程都放到主窗体,其它功能窗体从主窗体获取;发送的进程可以依具体情况放到各个窗体
      

  7.   

    我又想到了使用UDP协议。我觉得UDP协议要简单一些,数据报的形式对报文也好设计。
    但是我又有一个顾虑,就是在网络情况很差的时候,怎么去识别丢包。这个包是否丢了。
    就是说A往B发数据。A这边已经发了。但是B没收到。没收到我自己想的是分2种可能。1种是网络延迟,另一种是网络断了。我想在这里做个判断,来确定是否丢包。谁知道解决办法啊?
      

  8.   

    或者是这样,假设:
    PCA 和 PCB 之间的UDP通信。
    PCA 向 PCB 发送了2个数据报,分别为 pack1 和pack2
    PCB收到了pack2 但没有收到pack1 
    那么PCB还有可能收到pack1吗?
    为什么?
      

  9.   

    udp处理丢包麻烦,简单用直接用tcp就好了.一般简单的数据格式就是:
     包头标志 + 包大小  + 包数据
    一般4个字节  4个字节   可变自己处理粘包问题.
      

  10.   

    不管是使用udp还是使用tcp我都担心一个数据乱的问题。因为我不知道网卡在内部是怎样的机制在运行,没有这方面的经验和知识。
    我想知道,网卡的工作原理是怎样的。我自己设想是这样的:
    网卡里面有一个消息队列,当程序要发消息,就会把消息写入消息队列,然后网卡把消息出队,然后送出。
    当有消息进入网卡,也是进队,等待程序提取,它们都是有序的,不会说顺序错乱。
    其实质是这样吗?如果是这样,那么它这个队列是先进先出,还是后进先出呢?它最大能容纳多少个消息呢?
    烦请高人指点迷津。
    拜谢。
      

  11.   

    要传送大量二进制内容,不适合走转为命令而设计的服务通道。你可以使用HttpListener来开发短连接的、转为post文件而设计的服务。参考:http://www.google.com.hk/#q=.net+httplistener+multipart/form-data&hl=zh-CN&newwindow=1&safe=strict&biw=1378&bih=844&prmd=imvnsfd&source=lnt&tbs=lr:lang_1zh-CN%7Clang_1zh-TW&lr=lang_zh-CN%7Clang_zh-TW&sa=X&ei=M0J2UIrrGqqkiAeljYHYBQ&ved=0CBcQpwUoAQ&bav=on.2,or.r_gc.r_pw.&fp=5aa343445015814f
      

  12.   

    恩重新贴一下链接:http://www.google.com.hk/search?hl=zh-CN&lr=lang_zh-CN%7Clang_zh-TW&newwindow=1&safe=strict&biw=1378&bih=844&tbs=lr%3Alang_1zh-CN%7Clang_1zh-TW&q=.net+httplistener+multipart%2Fform-data&btnG=Google+%E6%90%9C%E7%B4%A2如果使用专为命令而开发的服务(在一个贴中我随便假设了一种形式),那么二进制数据需要进行base64编码。所以假设需要大量二进制数据,那么不应该采取这种形式。http的get和post可以用于上传下载二进制数据(post既适合上传也适合下载)。