本帖最后由 zhxingway 于 2010-05-18 14:50:04 编辑

解决方案 »

  1.   


     IPAddress serverIp = IPAddress.Parse("192.168.0.3");   
                IPEndPoint iep = new IPEndPoint(serverIp, 2222);   
                socket.Connect(iep);  //连接服务器   
     TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Any, 2222));    //2222端口   
      
            public FrmReceive()   
            {   
                InitializeComponent();   
      
                listener.Start();  //开始侦听端口   
                Thread acceptThread = new Thread(new ThreadStart(AcceptWorkThread));   
                acceptThread.Start();  //接受客户端请求               
            }   
      
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/adsdassadfasdfasdf/archive/2010/05/11/5579602.aspx
      

  2.   

    因为当用户通过WebForm发送控制信息后,要等一小段时间才能获得单片机返回的数据,所以不能通过一个函数的返回值来传递信息吧?
    不知道函数回调行不行,正在想办法.
      

  3.   

    我也考虑了用一个临时文件来中转,但是觉得这样效率不是很高
    寻求更好的解决方法3楼贴的那些TCP侦听的代码我都已经实现了.还是谢谢你哦.
      

  4.   

    利用短信猫发送短信,并收取短信猫反馈的是否发送成功的消息,这个例子不也是webform去调用短信猫硬件,然后获取反馈信息的嘛。不过短信猫有配套的webform的插件,可以在web中调用,直接获取反馈信息,你的单片机没有这类配套插件的话,要么,自己写插件,要么曲线救国,从数据库中转。既然是要一小段时间之后,单片机才会反馈信息,那么,在webform上完全可以设定,多少时间之后去服务器请求,看看数据库中是否有反馈消息,没有,则继续等待。当然,再次等待消息,这个时间就可以缩短了,可以一分钟请求一次,或者30秒~~
      

  5.   

    如果要实现实时
    建议 采用Comet模式进行吧
    也就是4楼说的服务器推的方法可以百度相关例子
      

  6.   

    你的意思就是说 要让浏览器主动获取最新的数据了?功能就像于web版的聊天工具?
      

  7.   

    jol_boy,谢谢你.
    我会考虑这种方法的.
    不过据我所知,WCF可以实现我要的功能,只是我还没有学到这方面的资料,呵呵.
      

  8.   

    服务器推送,可以参考http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
    其实这样也有一个问题,web服务器和你服务器上去调用单片机的程序算不上一个整体,单机程序从单片机上获取到反馈信息后,把这个信息,通过web服务器推动到客户端,就这个过程就很难实现!还不如让客户端定时的上服务器请求一次,看看是否有反馈信息!只要请求时间设置合理,效率不会太低的
      

  9.   

    功能应该有些类似,但是我这些数据并不是存取在数据库里面的,或许可以这样做.
    也感谢10楼的朋友建议的Comet模式.
      

  10.   


    按照你的思路,那么解决方法就是:
    当客户端(WebForm)发送一个命令后,Winform负责把单片机传回来的数据在某个介质中存储起来,然后Webform定时读取介质中的数据了?我现在在想能不能把Webform和Winform合成一个整体,
    我以前看到另一篇帖子中说,可以做成一个Web服务来侦听,然后Webform来请求这个Web服务,这样就可以不用Winform,直接在Webform中处理就行了,但是我不知道具体应该怎样做,我希望做过类似项目的朋友提供一个完整的思路,谢谢.
      

  11.   

    单片机有没有提供相应的web端插件啊?
      

  12.   

    如果在线并发不高的话,可以采用基于 HTTP 长连接技术comet,否则,就用ajax来定时向服务端请求.
    可惜的是,第一种因为采用长连接,会很影响并发,第二种因为是个定时的轮询,所以也比较耗资源.
    因为HTTP的协议限制,目前好像就这有这2种算法,当然貌似用flash或者activeX可以实现socket,这个我没了解过.还有,winform和web服务的通信 你可以用数据库,也可以在web端(我这里不是指服务 windowsservice,而是你通过IIS部署的web网站)写一个socket(用WCF也行),与winform连接进行交互.一般现成的例子,你可以去找 web客服  这种项目. 当然他的服务端(指客服人员操作部分)并不一定是用winfrom实现的.参考:
    http://blog.csdn.net/21aspnet/archive/2008/11/20/3341805.aspx
      

  13.   

    没有提供Web插件哦,它是通过一个GPRS模块连接到互联网上的服务器的.会定时发送一些数据.
    然后会根据服务器发送来的命令返回一些数据.如果不做成Web的,那还是比较简单的.
    但是要做成Web的话,好伤脑筋哦,虽然我知道问题不是很复杂的,但是已经困扰我一个月了
      

  14.   

    对于轮询,你可以找我要一个小例子,比较简单,就是模仿webqq的.实现了网页(b2b)无刷新聊天.
      

  15.   

    非常感谢21楼的朋友hopewoo的回答,
    我也想到过Webform和winform间用Socket来通信这样的话,
    Winform要建立一个TCP侦听来处理单片机的数据,
    还要建立一个SOCKET侦听来处理Webform的请求,
    哈哈,不错,不过学习了一阵WCF,暂时还没有解决方法,
    不过我相信用WCF可以解决,
      

  16.   

    这样:
    1.web和单片机无关,web只和数据库关联,间隔请求服务器,刷新数据.
    2.平时 服务器(Winform程序)侦听单片机发来的数据 都组织入库。
    3.服务器捕捉到web请求后,联系单片机,单片机返回的数据入库。下次web请求查库就能取到这条。 web中嵌个iframe或ajax来处理间隔请求.
      

  17.   

    不是啊,你看错了,呵呵
    我就写Webform,Winform,还有单片中的通信模块
      

  18.   

    那你必要的控制信息,或者GUID总有设计吧?单片机是一台还是多台?
      

  19.   

    做个activex控件吧,嵌入到浏览器中,由控件负责数据通信
      

  20.   


    单片机的数目不定,但是在通信报文中可以根据单片机的出厂日期来区分,这个通信规约中可以处理.如果用数据库来暂存不行的话,我看要想一下Winform和Webform间也用Socket来通信了不过我想不用Socket,用WCF应该也可以的啊,正在研究中....
      

  21.   


    哈哈,我又来啦.
    早上顶一顶帖子,不腰疼,也不头晕了.希望可以得到各位朋友用WCF解决这个技术的建议,
    或者是不能用WCF解决的理由.谢谢.
      

  22.   

    WCF还没深入研究,呵呵~~估计现在也还没到达大面积使用,资料还不是很丰富
      

  23.   

    jol_boy,你又来啦,呵呵.谢谢你的关注.
      

  24.   

    解决了客户端通过服务器发送命令给单片机的问题
    但是还没有解决 服务器把结果回传给客户端的问题,因为当服务器发送命令给单片时,是需要一定的等待时候才能收到数据的,所以不知道怎样处理这个等待过程,
    用while循环空等肯定不行,
    如果用消息侦听的话,可以把侦听到的消息返回给客户,
    但是,因为客户端很多,存在并发问题,又不知道怎样区分这些客户端,把这些结果准确地返回.汗...
    要继续努力啊.
      

  25.   

    这和WCF无关,WCF也不过是把本来就有的技术和方案整合成一个框架而已。
    B/S的结构注定无法实时的通信,除非使用server push技术,使用ajax方案定时去取服务器的数据应该是可以接受的。
    首先从客户端浏览器发出指令给服务器,由于服务器无法立即返回结果,所以开启一个线程去执行耗时的指令,再返回一个等待消息给客户端。线程处理完成后把结果存到session中,客户端再通过ajax去取结果,最终呈现给用户。
      

  26.   

    你这个最主要的问题就是WEB服务无法主动下发数据。
    比较常见的处理是轮询的方式,但个人觉得效率太低,就是把反馈的结果放到一公共区域,然后由你的WINFORM服务器轮询,有数据了,则分析数据,根据数据发送给单片机端。单片机和WINFORM可以用SOCKET。至于你说异步回调,可以尝试下
      

  27.   

    wcf用契约,你可以看看wcf的相关资料,这个不难
      

  28.   

    现在问题是,当发送控制信息给单片机后,如何将单片机回馈的信息显示在浏览器中?这个应该 厂家提供了api的.winform程序如果可以获取到.那webform就可以获取到
      

  29.   

    这个应该和WCF没有多大关系,现在的关键是单片机需要一段时间才能响应客户端的请求,而在这段过程中就会出现超时现象,是不是可以考虑客户端使用定时器去获取前一次的请求结果回来呢。
      

  30.   

    我的一点理解:
    1〉winform负责同单片机通信,并把取得的数据存储在数据库里面。
    2〉webservice负责同webform/winform通信,
    3〉浏览器的指令通过webservice传递给winform,
    4〉浏览器需要的数据通过webservice取得并返回到webform
      

  31.   


    BHO 挂钩程序或IE插件程序就可以轻松搞定
      

  32.   

    我以前有个同事写的单片机的上位机程序,他是用C++写的,他把源码给我让我进行封装。程序里除了串口通信外,就是2进制,8进制,16进制的数值处理,我看不懂细节,但程序结构我不得不理清。
    他是用定时器不停的向单片机发送命令,然后获取数据的,会有当单片机下一个数据过来的时候,PC程序还在处理上一个数据的情况,此时定时器的上一个处理过程没有结束,但下一个数据还是会进入定时器的。那么这时就有两条数据在同时处理,有点多线程的意思。
    不过我不知道C#中的定时器是否也有这种效果,或者你可以直接用多线程
      

  33.   


    现在难点是第四点,就是数据返回给Webform了,但是显示不出来我是用WCF双工回调的,请各位朋友帮我看看.
      

  34.   

    不知道楼主现在这个问题解决了没,我也在做WEB和WINFORM之间彼此聊天的一个程序,用WCF实现,初步我是这样定义的:1.在线访客(WEB)列表2.winform在线客服人员列表3.WCF服务定义回调契约,不知道WEB与WINFORM通信的时候是怎么样实现?还是每个都实现回调?每个WINFORM相当于一个SERVICE?这不懂。