【问题标题】:Unicast / Multicast a message to a group of users by using UDP使用 UDP 向一组用户单播/多播消息
【发布时间】:2015-05-27 11:41:21
【问题描述】:

您好,我是 java 和网络编程的新手...我尝试将两个 UDP 数据包从 (AssignmentChatClient) 发送到服务器 (AssignmentChatServer ),服务器会检查第一个包含(目标IP地址)的数据包,然后将第二个数据包(message)转发到目标 (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);}             
}
}

【问题讨论】:

    标签: java sockets networking socket.io network-programming


    【解决方案1】:

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

    【讨论】:

    • 我只需要在一个数据包中发送最终目标地址和有效负载?我的代码中是否还有其他错误或错误?在此先感谢:)
    猜你喜欢
    • 2014-12-04
    • 2013-02-07
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多