我正在构建一个将在多个"客户端上部署的应用程序"与一个共同的"服务器"。显然,我可以使用每个客户端 - 服务器链接的单个读写套接字在每个客户端和服务器之间进行通信,或者如果我真的想要,则每个链接使用一个读取套接字和一个写入套接字。
但是,如果服务器想要从任何客户端读取(并希望是好的)原因并向所有客户端广播,该怎么办?如果你有一个像UDP这样的无连接协议,那么服务器是否只能使用一个读写套接字,或者它必须使用一个用于读取而一个用于写入?客户呢?如果你使用像TCP这样的基于连接的协议,这会改变吗?
答案 0 :(得分:1)
如果您有像UDP这样的无连接协议,服务器是否只能使用一个读写套接字,还是必须使用一个读取和一个写入?客户呢?如果你使用像TCP这样的基于连接的协议,这会改变吗?
作为端点的套接字,在UDP和TCP的情况下至少具有本地地址和端口。只有为此ip和端口接收的数据才会传送到套接字,并且从此套接字发送的所有数据都包含本地IP和端口作为源。可以连接套接字,在这种情况下,目标IP和端口也是已知的。使用TCP时,需要连接套接字,而不是UDP。
这意味着:
有关详细信息,请参阅相关问题并附上答案:Bidirectional UDP Multicast
答案 1 :(得分:1)
但是如果服务器想要的(希望是好的)原因怎么办呢 从任何客户端读取,并向所有人广播?
那么你可能想要使用UDP套接字(代替或替代某些TCP套接字):)
如果您有UDP之类的无连接协议,服务器是否可以使用 只有一个读写插座,或者必须使用一个读写插座 一个写作?
单个UDP套接字对于读取和写入都是足够的(尽管一些多线程设计可能会更容易使用两个单独的套接字;这两种方式都可以工作)。
客户怎么样?
客户端也可以使用单个套接字来发送和接收UDP数据包,如果这就是您所要求的。
如果你使用像TCP这样的基于连接的协议,这会改变吗?
使用TCP套接字,您还可以使用单个套接字进行发送和接收。但是,对于要发送或接收的每个目标,您将需要一个TCP套接字。 (与UDP对比,其中单个UDP套接字可与sendto()或recvfrom()一起使用以与多个对等体通信)
答案 2 :(得分:-2)
根据您的要求,您有两种方式:
仅使用TCP连接:服务器从客户端读取消息并向所有客户端广播,服务器将消息写入所有客户端的TCP套接字(连接到客户端),客户端读取该消息来自TCP套接字(连接到服务器)。此方法要求客户端和服务器知道彼此的IP地址
通过TCP连接用于客户端 - 服务器直接通信和UDP用于广播:在此方法中,客户端和服务器使用TCP连接(直接一对一)进行通信。为了广播该消息,服务器可以使用UDP套接字通过网络广播该消息,并且客户端具有用于接收广播消息的UDP广播接收器。