为啥多播不起作用?

Posted

技术标签:

【中文标题】为啥多播不起作用?【英文标题】:Why multicasting isn't working?为什么多播不起作用? 【发布时间】:2015-12-02 18:43:02 【问题描述】:

我的程序无法正常运行。问题是第二个客户端看不到来自第一个客户端的消息。我认为问题出在while循环中。只是不从 IP 地址读取。你能帮助我吗? 提前谢谢你。

package multicastchat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class MulticastChat 

    int chatRoom = 0;
    int port = 0;
    String ipAdress = "";
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public MulticastChat()

    

    public void choosingChatRoom() throws IOException
        while (!(chatRoom > 0 && chatRoom < 5)) 
            System.out.println(
                    "We have four chat rooms, choose one of them (1, 2, 3, 4)");
            chatRoom = Integer.valueOf(br.readLine());
            switch (chatRoom) 
                case 1:
                    port = 4441;
                    ipAdress = "230.0.0.1";
                    break;
                case 2:
                    port = 4442;
                    ipAdress = "230.0.0.2";
                    break;
                case 3:
                    port = 4443;
                    ipAdress = "230.0.0.3";
                    break;
                case 4:
                    port = 4444;
                    ipAdress = "230.0.0.4";            
                    break;
                default:
                    System.out.println("Sorry, but we haven't this room, try another room");
                    this.choosingChatRoom();
                    break;
            
            System.out.println("Welcome to room " + chatRoom);
        
    

    public static void main(String[] args) throws IOException 
        MulticastChat mc = new MulticastChat();
        mc.choosingChatRoom();
        MulticastSocket socket = new MulticastSocket(mc.port);
        InetAddress address = InetAddress.getByName(mc.ipAdress);
        socket.joinGroup(address);

        DatagramPacket outMessage;
        DatagramPacket inMessage;

        String userInput;

        while (true) 
            //Receiving message
            inMessage = new DatagramPacket(new byte[4096], 4096);
            inMessage.setLength(inMessage.getData().length);
            socket.receive(inMessage);
            String received = new String(
                    inMessage.getData(), 0, inMessage.getLength());
            System.out.println(received);   
            //Sending message
            if ((userInput = mc.br.readLine()) != null) 
                if (userInput.equals("quit")) 
                    System.out.println("Bye, see you later ^_^");
                    socket.leaveGroup(address);
                    socket.close();
                    System.exit(0);
                 else 
                    byte[] buff = userInput.getBytes();
                    outMessage =
                            new DatagramPacket(buff, buff.length, address, mc.port);
                    socket.send(outMessage);
                
                     
        
    

【问题讨论】:

【参考方案1】:

假设您在聊天的两端使用相同的程序,则不会发生任何事情。每个实例都是在写入任何内容之前从套接字读取启动的,因此它将永远阻塞。

没有实例可以写入套接字。

请注意,套接字编程通常需要多个线程,因为事情在至少两个“通道”(用户交互和套接字 I/O)上异步发生。对如何编写网络代码的完整解释远远超出了 *** 的设计目的。

【讨论】:

“通常”是一个强词。有很多网络感知 UI 程序在单线程模型中运行。 一旦网络 I/O 因任何原因阻塞,单线程模型就会“中断”——UI 变得无响应。当 UI 被阻塞等待输入并且足够的数据通过网络到达溢出缓冲区时,它也会中断。 学会爱 poll() :) 我是根据经验说话的,我所谈论的世界上没有什么“中断”。

以上是关于为啥多播不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

删除活动课程后,引导轮播不起作用

在单个页面上使用两个(猫头鹰)轮播不起作用

IE11中的猫头鹰轮播不起作用

修改php.ini不起作用是为啥

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?

为啥 preventDefault 不起作用?