2017-05-03 144 views
1

我在解释大学作业的问题时遇到问题。看来我的解决方案不是一个可以接受的答案。我不是在寻找解决方案,而是主要解释我做错了什么。如何实现聊天客户端

的问题是:

实现透射用户消息发送到多播地址,并接收来自其他客户端上发送到相同的多播地址的其他机器发送的消息的简单的聊天客户端。

我解释这一点的方式是我有一个服务器类与多播地址,然后n个客户端类连接或加入服务器组。 然后当客户端连接到服务器类。服务器将相同类型的消息发送给客户端屏幕上显示的多个客户端。我有什么要求吗?我对组播服务器代码,

package multicastchatter; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class multicastServer { 

    final static String INet_addr = "224.0.0.3"; 
    final static int PORT = 8888; 


    public static void main(String[] args) throws InterruptedException, UnknownHostException { 
     InetAddress addr = InetAddress.getByName(INet_addr); 

     try(DatagramSocket serverSocket = new DatagramSocket())//open the datagram 
     { 
       for(int i = 0; i<5; i++) 
       { 
        String message = "Sent message number "+i; 
        //create a packet and send 
        DatagramPacket messPack = new DatagramPacket(message.getBytes(),message.getBytes().length, addr, PORT); 
        serverSocket.send(messPack); 

        System.out.println("The server says"+ message); 
        Thread.sleep(500); 
       } 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

} 

和我的组播客户端是

package multicastchatter; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.InetAddress; 
import java.net.MulticastSocket; 
import java.net.UnknownHostException; 

public class multicastClient { 

    final static String INet_addr = "224.0.0.3"; 
    final static int PORT = 8888; 
    //final static int PORT = 8080; 

    public static void main(String[] args) throws UnknownHostException { 
     InetAddress address = InetAddress.getByName(INet_addr);//get address 
     byte[] buf = new byte[256];//create a buffer of bytes 

     //create the multicast socket 
     try(MulticastSocket clientSocket = new MulticastSocket(PORT)) 
     { 
      clientSocket.joinGroup(address);//join the group 
      while(true) 
      {//recieve the info 
       DatagramPacket messPack = new DatagramPacket(buf, buf.length); 
       clientSocket.receive(messPack); 

       String message = new String(buf, 0, buf.length); 
       System.out.println("Socket recieved message saying" + message+ " by "+ messPack.getAddress()); 
      } 

     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

} 

任何建议表示赞赏。我能想到的是,我需要从客户端将消息发送回服务器?

回答

0

因为你的问题是问你的客户端 - 服务器架构的概念是否正确,那么是的。您的老师需要的是一台接受客户端连接的服务器,并将收到的客户端消息广播给所有客户端。

在这种情况下,通常会选择多线程服务器方法,因为正在使用许多并发连接,并且每个都在等待消息。收到该消息后,服务器将采取该消息,在前面追加一个标识符,以便我们知道客户说什么该消息,并只将该消息分发给每个客户端。

至于客户端,它只需要输入,在必要时发送,并且始终监听来自服务器的数据包,显示接收到的任何数据包。一个有价值的建议:

不允许客户端显示收到之前发送的内容。换句话说,从客户端程序发送输入应该只显示从服务器接收回来的内容。在大多数情况下,在服务器 - 客户端体系结构中使用这是一个很好的做法

+0

这是一个非常好的清晰解释,谢谢dddJewelsbbb – ryan1234

+0

很高兴帮忙,@ ryan1234祝你好运:) – dddJewelsbbb