java - 使用 UDP 单播/多播向一组用户发送消息

标签 java sockets networking socket.io network-programming

您好,我是java和网络编程的新手...我尝试(AssignmentChatClient)发送两个UDP数据包到服务器(AssignmentChatServer),服务器将检查包含(目的地IP地址)的第一个数据包,然后将第二个数据包(消息)转发到目的地(AssignmentChatClient2)。我有一个问题,目的地 (AssignmentChatClient2) 没有收到数据包...你们能帮我指出问题出在哪里吗?提前致谢...

这是代码

作业聊天服务器

import java.net.*;
import java.io.*;

public class AssignmentChatServer {

public static void main(String args[]) throws IOException {
    int sPort = 2222, cPort = 3333;
    byte[] buf = null;
    byte[] buf2 = null;
    System.out.println("Listening to socket port " + sPort);

        try (DatagramSocket serverSocket = new DatagramSocket(sPort)) {

            while (true) {
                buf = new byte[128];
                buf2 = new byte [1024];
                String addr = "";
                String sMsg = "";
                char [] tempC = null;
                DatagramPacket addrPacket = null;
                DatagramPacket msgPacket = null;    

                addrPacket = new DatagramPacket(buf, buf.length);
                serverSocket.receive(addrPacket);
                String address = new String(addrPacket.getData()).trim();
                System.out.println(address);
                tempC = address.toCharArray();

                for(int i = 0; i < tempC.length; i++){
                    if(tempC[i] == '-'){
                        InetAddress sAddr = InetAddress.getByName(addr);

                        msgPacket = new DatagramPacket(buf2, buf2.length);
                        serverSocket.receive(msgPacket);
                        String msg = new String(msgPacket.getData());
                        sMsg = msg.trim();

                        msgPacket = new DatagramPacket(sMsg.getBytes(),sMsg.getBytes().length, sAddr, cPort);
                        serverSocket.send(msgPacket);
                        System.out.println(sMsg);
                        addr = "";
                        continue;
                    }   
                    addr += tempC[i];
                }
            }   
        }catch(IOException ex){System.out.println(ex);}         
}
}

AssignmentChatClient

import java.net.*;
import java.io.*;

public class AssignmentChatClient {

public static void main(String args[]) throws IOException {
    int sPort = 2222, cPort = 3333;
    byte[] buf = null;
    byte[] buf2 = null;

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    System.out.print("Please enter server address : ");
    String serAddress = input.readLine();
    InetAddress sAddr = InetAddress.getByName(serAddress);

    System.out.println("Connecting to server socket on port " + sPort);

        try (DatagramSocket clientSocket = new DatagramSocket(cPort)) {

            while (true) {
                buf = new byte[128];
                buf2 = new byte [1024];
                String temp = "";
                String sMsg = "";
                String rMsg = "";
                DatagramPacket addrPacket = null;
                DatagramPacket rlyPacket = null;
                DatagramPacket msgPacket = null;

                System.out.print("How many the number of users do you want to send to : ");
                int nUsers = Integer.parseInt(input.readLine());

                byte [] address = new byte [nUsers];
                address = null;

                System.out.print("Enter message : ");
                sMsg = input.readLine();

                if(sMsg == null)
                        return ;

                for(int i = 0, j = 0; i < nUsers ; i++){
                    System.out.print("Please enter address " + ++j + " : ");
                    temp += input.readLine();
                    temp += "-";
                }

                address = temp.getBytes();
                addrPacket = new DatagramPacket(address,address.length, sAddr, sPort);
                clientSocket.send(addrPacket); 
        //      System.out.println(temp);

                msgPacket = new DatagramPacket(sMsg.getBytes(),sMsg.getBytes().length, sAddr, sPort);
                clientSocket.send(msgPacket); 
        //      System.out.println(sMsg);
        //      System.out.println(sAddr.toString());

                rlyPacket = new DatagramPacket(buf2, buf2.length);
                clientSocket.receive(rlyPacket);
                String msg = new String(rlyPacket.getData());
                rMsg = msg.trim();
                System.out.println(rMsg);                   
            }   
        }catch(IOException ex){System.out.println(ex);}     
 }
 }

AssignmentChatClient2

import java.net.*;
import java.io.*;

public class AssignmentChatClient2 {

public static void main(String args[]) throws IOException {
    int sPort = 2222, cPort = 3333;
    byte[] buf = null;
    byte[] buf2 = null;

    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    System.out.print("Please enter server address : ");
    String serAddress = input.readLine();
    InetAddress sAddr = InetAddress.getByName(serAddress);

    System.out.println("Connecting to server socket on port " + sPort);

        try (DatagramSocket clientSocket = new DatagramSocket(cPort)) {

            while (true) {
                buf2 = new byte [1024];
                String temp = "";
                String replyMsg = "";
                String rMsg = "";
                DatagramPacket addrPacket = null;
                DatagramPacket rcvPacket = null;
                DatagramPacket msgPacket = null;

                rcvPacket = new DatagramPacket(buf2, buf2.length);
                clientSocket.receive(rcvPacket);
                String msg = new String(rcvPacket.getData());
                rMsg = msg.trim();
                System.out.println(rMsg);
                InetAddress rAddr = rcvPacket.getAddress();
                temp = rAddr.toString();

                System.out.print("Enter message : ");
                replyMsg = input.readLine();

                if(replyMsg == null)
                        return ;

                addrPacket = new DatagramPacket(temp.getBytes(),temp.getBytes().length, sAddr, sPort);
                clientSocket.send(addrPacket); 
        //      System.out.println(temp);

                msgPacket = new DatagramPacket(replyMsg.getBytes(),replyMsg.getBytes().length, sAddr, sPort);
                clientSocket.send(msgPacket); 
        //      System.out.println(replyMsg);
        //      System.out.println(sAddr.toString());
                }                       
        }catch(IOException ex){System.out.println(ex);}             
}
}

最佳答案

请记住,UDP 不可靠
您不应该依赖于第一个数据包在(或曾经)到达收件人之前到达。 您需要在一个数据包中提供最终目标地址有效负载。

关于java - 使用 UDP 单播/多播向一组用户发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30481421/

相关文章:

java - 如何为嵌入式 jetty/ Spring 安全启用 HTTP 摘要?

java - 为什么命名字符串变量 String 是一个有效的 Java 结构?

c# - 网络传输暂停

linux - socat 监听分配给特定网络接口(interface)的所有 IP

ruby-on-rails - Redis:奇怪的协议(protocol)/网络错误

java - 我们是否需要在 ActionListener 中使用 "dispose()"的中间方法?

java - 转换为 JSTL(特别是调用方法)

java - 当代码保持接受新套接字时,如何检查某些变量?

java - 读取/写入 Java 服务器套接字的最佳实践

math - 确定两个 IP 地址是否在同一子网上 - 是否从 IP 地址中删除前导或尾随 0?