0

每个人。我有一个关于套接字使用的问题。虽然看起来很简单,但我无法管理它。那么问题来了:我可以只使用一个套接字向多个客户端发送数据包吗?

ds1 = new DatagramSocket();
dp1 = new DatagramPacket(packet, packet.length, InetAddress.getByName(address1), port);
dpto2 = new DatagramPacket(packet, packet.length, InetAddress.getByName(address2), port);
dpto3 = new DatagramPacket(packet, packet.length, InetAddress.getByName(address3), port);**

地址1,地址2和地址3在这里是不同的。我想在一个程序运行中连接到多个客户端并向它们发送 UDP 数据包。我还没有测试它,只是想得到一些关于如何做的建议。

任何帮助,将不胜感激...

4

2 回答 2

2
  1. 您不使用 UDP 连接到客户端,UDP 是无连接的。如果您确实需要连接的概念,则需要切换到 TCP(但在许多情况下,您实际上并不需要该概念)。
  2. 是的,您可以使用一个向多个客户端发送数据DatagramSocket
于 2013-08-13T10:56:22.190 回答
0

我想,如果我理解了这个问题,如果要发送的数据对于所有客户端都是相同的,那么就不需要为每个客户端创建单独的数据包,只需创建一个数据包并更改其地址(如有必要,还可以更改端口)像这样会这样做:

/**
 * Send a DatagramPacket to all addresses in hosts.
 * @param socket 
 *  A created DatagramSocket
 * @param hosts 
 *  Array of strings containing the hosts to send the packet, 
 *  each one can be either a host name or a dotted IP address.
 * @param port
 *  The port the clients are listening
 * @param data
 *  Data to send
 * @return
 *  Number of packets sent.
 */
int sendPackets(DatagramSocket socket, String[] hosts, int port, byte[] data)
{
    if (hosts.length > 0)
    try
    {
        int ret=0;
        DatagramPacket packet = new DatagramPacket(data, data.length);
        packet.setPort(port);
        for (int i = 0; i < hosts.length; i++)
        {
            try 
            {
                packet.setAddress(InetAddress.getByName(hosts[i]));
                socket.send(packet);
                ret++;
            }
            catch (Exception e)
            { 
                Log.e("SEND:", "Error sending to host: " + hosts[i]);
                e.printStackTrace();
            }
        }
        return ret;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return 0;
}

您可以像这样使用该功能:

try {
    DatagramSocket socket = new DatagramSocket();
    byte[] data = "This is a test message.\n".getBytes();
    sendPackets(socket, new String[] { "192.168.1.10", "192.168.1.12", "192.168.1.54" }, 2020, data);
} 
catch(Exception e){}
于 2013-08-13T18:40:42.153 回答