⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nameserver.java

📁 java3D game engine design of the source [three-dimensionalvirtualrealitynetworkprogram] - "virtual
💻 JAVA
字号:

// NameServer.java
// Andrew Davison, June 2003, dandrew@ratree.psu.ac.th

/* A server that accepts datagrams from users involved in
   a chat multicast group. 

   A user sends a "hi <name>" message to try to join the
   group. If the name is unique
   then the server sends back the multicast group address as
   a string. The name is added to a group members list.

   A "bye <name>" message removes the client from the list.
   No checking is done to see if the client has actually left
   the multicast group.

   The response to a "who" message is a list of the current
   group member names.
*/

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


public class NameServer
{
  private static final String GROUP_HOST = "228.5.6.7";
      // the multicast group address sent to new members

  private static final int PORT = 1234;      // for this server
  private static final int BUFSIZE = 1024;   // max size of a message

  private DatagramSocket serverSock;

  private ArrayList groupMembers;  
    // holds the names of the current members of the multicast group

  
  public NameServer()
  {
    try {  // try to create a socket for the server
      serverSock = new DatagramSocket(PORT);
    }
    catch(SocketException se)
    {  System.out.println(se);
       System.exit(1);
    }

    groupMembers = new ArrayList();
    waitForPackets();
  } // end of NameServer()


  private void waitForPackets()
  // wait for a packet, process it, repeat
  {
    DatagramPacket receivePacket;
    byte data[];

    System.out.println("Ready for client messages");
    try {
      while (true) {
        data = new byte[BUFSIZE];  // set up an empty packet
        receivePacket = new DatagramPacket(data, data.length);
        serverSock.receive( receivePacket );  // wait for a packet

        // extract client address, port, message
        InetAddress clientAddr = receivePacket.getAddress();
        int clientPort = receivePacket.getPort();

        String clientMsg = new String( receivePacket.getData(), 0,
                           receivePacket.getLength() ).trim();
        System.out.println("Received: " + clientMsg);

        processClient(clientMsg, clientAddr, clientPort);
      }
    }
    catch(IOException ioe)
    {  System.out.println(ioe);  }
  }  // end of waitForPackets()


  private void processClient(String msg, InetAddress addr, int port)
  /* There are three possible types of message:
       hi <name>   // add the name to the group list (if name is unique)
                      and tell them the multicast address

       bye <name>  // delete this name from the group list

       who         // send back a list of all the current members
  */
  {
    if (msg.startsWith("hi")) {
      String name = msg.substring(2).trim();
      if (name != null && isUniqueName(name)) {
          groupMembers.add(name);
          sendMessage(GROUP_HOST, addr, port);  // send multicast addr
      }
      else
        sendMessage("no", addr, port);
    }
    else if (msg.startsWith("bye")) {
      String name = msg.substring(3).trim();
      if (name != null)
          removeName(name);  // removes name from list
      // note: nothing is done to check the actual multicast group
      // or to verify who sent this message   
    }
    else if (msg.equals("who"))
      sendMessage( listNames(), addr, port);
    else
      System.out.println("Do not understand the message");

  }  // end of processClient()


  private void sendMessage(String msg, InetAddress addr, int port)
  // send message back to the client
  {
    try {
      DatagramPacket sendPacket =
          new DatagramPacket( msg.getBytes(), msg.length(), 
   						addr, port);
      serverSock.send( sendPacket );
    }
    catch(IOException ioe)
    {  System.out.println(ioe);  }
  } // end of sendMessage()


  // ------------------- names processing -------------------


  private boolean isUniqueName(String nm)
  // return true if nm is not already in the group members list
  {
    String name;
    for(int i=0; i < groupMembers.size(); i++) {
      name = (String) groupMembers.get(i);
      if (name.equals(nm))
        return false;
    }
    return true;
  } // end of isUniqueName()


  private void removeName(String nm)
  // remove nm from the group members list
  {
    String name;
    for(int i=0; i < groupMembers.size(); i++) {
      name = (String) groupMembers.get(i);
      if (name.equals(nm)) {
        groupMembers.remove(i);
        break;
      }
    }
  }  // end of removeName()

  
  private String listNames()
  /* Return the group members list as a string of the form
        no. name \n no1. name1 \n ...
  */
  { String list = new String();
    String name;
    for(int i=0; i < groupMembers.size(); i++) {
      name = (String) groupMembers.get(i);
      list += "" + (i+1) + " " + name + "\n";
    }
    return list;
  } // end of listNames()


  // ------------------------------------

  public static void main(String args[]) 
  {  new NameServer();  }


} // end of NameServer class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -