B、C可以共享一个socket客户端连接

解决方案 »

  1.   

    不行的。socket是需要server和client建立了才能发数据
      

  2.   

    你好,肯定是不信的,socket是点对点进行通信的。
      

  3.   

    把socket抽象成link对象,再多加一个读和写的数据缓存(rbf,wbf),把socket读到的消息放到写rbf,把socket要写的消息写到写缓存wbf,link的读写通过操作rbf和wbf,C就可以发送消息叫服务端往B的rbf里写数据,好像B在向A发送消息一样。把link放在map中方便查找,如map<"A",linkA>
    貌似可行
      

  4.   

    这种情形的解决方法应该是:
    你在接收消息的服务器上应该有配置文件列出集群中的各个主机以及相对应的IP地址
    集群中的每台主机都会建立一个ServerSocket监听一个特定端口
    当接收消息的服务器确定了与哪台集群中的主机建立链接后,通过配置文件找到这台主机相应的IP,使用Socket建立链接
    这样便完成了与集群中服务器的通讯从上面可以看出来,实际上接受消息的服务器是Socket Client,而集群中的服务器是Socket Server至于你的思路,是有问题的,先不说集群中的主机能不能共享Socket,socket是需要指定IP的,当然你可以使用广播来向集群广播信息,但是这样的业务逻辑就复杂了许多
      

  5.   

    我又看了一下,明白你的意思了,
    你的意思是不是:客户端向服务器A传送一个处理请求,服务器A将请求发送给集群中的一台服务器B,服务器B处理完成后将结果直接回传给客户端。
    如果这样的话,服务器A还有什么用处难道只是负责决定使用集群中的那一台服务器做处理?
    实际上,服务器A所做的类似于代理,将集群与用户之间屏蔽,客户只需知道服务器A,至于服务器A是自己处理请求还是交给集群,客户无需过问。
    所以说我认为集群的结果应该回传给服务器A,然后再由服务器A将结果回传给客户,这样他们之间交流的只是数据,而不用去考虑你说的那种Socket公用问题。
      

  6.   

    以前有个帖子问能不能对inputstream和outputstream这么做,直接挂上去。
    这和楼主的想法是类似的,都是个重定向问题。java是不能的。
    为什么不能呢?java故意这么设计的。因为java的设计者认为,你不应该采用这样的架构。
    对项目没有用的东西java不会做上,这是java与很多语言例如cpp的区别(不过cpp这么做对于cpp来说是对的)。
      

  7.   


    怎么实现呢,想不明白,困惑了很久了,有个场景是这样的在一个集群环境,一台服务器接受消息,然后使用集群的主机处理,哪台服务器处理消息就把结果发给客户端找个CS聊天室程序看看,通过Server转发聊天信息,不过在Server端需要额外的管理
      

  8.   

    Hi,
    楼主的问题提的很有意思。我想了一下,我觉得这里面有些东西大家没有说清楚。
    我寻思了一下也查了一些资料,在这里与大家一起讨论。
    1.Socket是套接字(协议,IP,端口),想要通信的机器都应该有一个套接字。
    2.常用的Socket通信是分为两种,一种是TCP,一种是UDP。(Socket编程内容)
    3.TCP为两端有连接通信,协议保证双方发包接受包的顺序和可达性。(有连接方式,两端连接)
    4.UDP为两端无连接通信,协议尽力发送数据包,不保证顺序和可达性。(无连接方式)这两种方式,发送方一定要知道对方的IP和端口。按照楼主所说的AB相连。如果C要发给A,那么C的目的IP地址必须填写A的地址,然后在A转发到AB通道中发给B。所以这样的复用是可行的。但是必须在A机器中实现通道连接。简单的实现例子。
    1.启动A->B两端连接,进程1
    2.启动C->A两端连接,进程2
    3.当A收到C的数据,进程2交付数据给进程1,并转发。
    (可以把1,2放在同一个进程中,交互可以更简单)我想只能靠转发的方式实现楼主的需求。如果想C直接输入B的IP,经过A->B的流来发送数据,应该是不行的。
      

  9.   

    首先这种方式肯定是可以的。具体实现方法是要把B服务做中转。c通过webservice,或者其他方式消息机制如消息队列等等。将信息发送给B然后B再转发给A即可。