现有一个项目,java做服务端,c#做客户端,通过Socket进行通信。功能主要是c#发送一个字符串给服务端,服务端返回对应的数据。现在遇到的问题是:由于起初对C#不了解,采用的方式就是发送在一次socket的send之后,recieve一次数据,并没有起一个线程不断的循环接收数据。现在要实现服务端主动发送通知给客户端,之前采用的方式就不可用了,现在就需要整体的调整。现在如果要起一个线程来recieve数据的话,由于客户端收到的数据会在不同窗体上展示,收到的数据就不清楚具体要给哪个窗体用。不知道如何解决这一问题。不知道有没有描述清楚,求助大家了,谢谢。

解决方案 »

  1.   

    和服务端通信,至少应该知道数据是要干什么用的吧?
    这就好比WebService接口中定义的方法名一下,不同的方法返回不同的数据
    知道当前收到的数据是干什么用的,就应该知道是要给哪个窗体用,触发相应的事件
      

  2.   

    哈哈 我自己写的通信也遇到了这样的问题了 
    我说下WCF的回掉方法(起一个线程来接受)和普通方法(你现在的Send一下接受一下)是必须分开的
    也就是说 WCF一个服务如果包含回掉方法 就不能有普通方法 有普通方法就不能有回掉方法
    个人感觉 如果你要实现这种新的效果 就比如自己重新写一个通信
    例如我的通信框架是服务器端监听两个端口
    一个端口是普通方法另一个端口专门负责回掉方法
    如果考虑效率的话 必须这样!
      

  3.   

    话说我也想过起两个端口,毕竟send一下和recieve一下就违背socket的本质了感觉上
      

  4.   

    这样说的话,另起的那个端口就应该算是长连接了把。请问下一般情况下如何保证长连接呢?还有send一下,revieve一下的情况,如果socket不中断,是不是也算长连接了。只不过没有一直在通信而已
      

  5.   

    你必须开两个端口 
    此处略去100字
    刚才上面略去的想说一种新方法 但是不实用
    也可以实现 要好多代码都要改 还要封装许多状态 而且要加上缓存 另外你发送的内容和接受的内容都要在封装
    总体东西太多而且你所有的send和receiver方法都要改只能说你原来没想到要用到这种效果 设计的时候没想到
      

  6.   

    这样说的话,另起的那个端口就应该算是长连接了把。请问下一般情况下如何保证长连接呢?还有send一下,revieve一下的情况,如果socket不中断,是不是也算长连接了。只不过没有一直在通信而已
    我想你搞反了,网络通信中所谓的长连接是利用socket来实现的,长连接要注意客户端的状态,通常可以用心跳包