nexusiiserver.java
来自「java版ace,java程序员值得一看」· Java 代码 · 共 281 行
JAVA
281 行
// The Nexus II server.// Sumedh Mungee <sumedh@cs.wustl.edu>import java.net.*;import java.io.*;import java.util.*;import ACE.OS.*;import ACE.SOCK_SAP.*;public class NexusIIserver implements consts { // Entry point into the server public static void main(String args[]) throws IOException { if(args.length != 1) { System.out.println("Usage: java NexusIIserver <port_num>"); return; } // Create a "Hotel", which is a factory to generate Rooms // as and when required. RoomFactory Hotel = new RoomFactory(); System.out.println("NexusII server booting"); SOCKAcceptor sacceptor = new SOCKAcceptor( (new Integer(args[0])).intValue()); System.out.println("NexusII is now accepting connections on port " + (new Integer(args[0])).intValue()); for(;;) { SOCKStream s = new SOCKStream(); sacceptor.accept(s); // Accepted connection // construct a client handler.. // Pass in the connected socket as an argument, // and a reference to the Hotel, in case it needs // to create rooms.. // and away you go.. new Thread(new ClientHandler(s, Hotel)).start(); } }} // This thread handles the clients..// It uses 2 additional threads for read/write network operations // These threads are dedicated to read/write from the// respective read/write queues.. class ClientHandler implements Runnable,consts { private SOCKStream s_; private RoomFactory Hotel_; private MT_Bounded_Queue rq_ = new MT_Bounded_Queue(QUEUE_SIZE); private MT_Bounded_Queue wq_ = new MT_Bounded_Queue(QUEUE_SIZE); private String my_name_; private Vector roomlist_ = new Vector(); private boolean finished_ = false; private String init_image_; public ClientHandler(SOCKStream s, RoomFactory h) { s_ = s; Hotel_ = h; init_image_ = new String(System.getProperty("mywebaddress") + NEXUS_LOGO); } public void run() { // Construct the reader/writer threads with the queues and the // corresponding socket data streams as parameters. Thread r_ = new socketReaderThread(rq_, new DataInputStream(s_.inputStream())); Thread w_ = new socketWriterThread(wq_, new DataOutputStream(s_.outputStream())); r_.start(); w_.start(); // now start parsing the messages, and take action.. // todo: optimize the below.. while(!finished_) { dataPacket d = (dataPacket) rq_.dq(); if(d.contentType().startsWith("INIT")) nexus_init(d); if(d.contentType().startsWith("JOIN")) nexus_join(d); if(d.contentType().startsWith("LEAVE")) nexus_leave(d); if(d.contentType().startsWith("QUIT")) nexus_quit(d); if(d.contentType().startsWith("TEXT")) nexus_text(d); if(d.contentType().startsWith("LUSERS")) nexus_lusers(d); if(d.contentType().startsWith("LROOMS")) nexus_lrooms(d); if(d.contentType().startsWith("NICK")) nexus_nick(d); if(d.contentType().startsWith("URL")) nexus_url(d); } } // The following classes implement the server functions.. private void nexus_init(dataPacket packet) { my_name_ = new String(packet.clientName()); wq_.nq(packet); } private void nexus_join(dataPacket packet) { Room r = Hotel_.getRoom(packet.content()); if(r.checkClient(this)) return; r.addClient(this); roomlist_.addElement(r); writeRoom(r, my_name_ + " has joined the room "); String contenttype = new String("url"); dataPacket d = new dataPacket(my_name_, packet.content(), contenttype, (new Integer(init_image_.length())).toString() , init_image_); wq_.nq(d); } private void nexus_text(dataPacket packet) { Room r = Hotel_.getRoom(packet.destination()); r.getQ().nq(packet); } private void nexus_lusers(dataPacket packet) { Room r = Hotel_.getRoom(packet.content()); Enumeration e = r.clientList(); StringBuffer sb = new StringBuffer(); while(e.hasMoreElements()) sb.append(" " + ((ClientHandler)e.nextElement()).getName() + " "); dataPacket d = new dataPacket(my_name_, packet.destination(), packet.contentType(), (new Integer(sb.length())).toString(), sb.toString()); wq_.nq(d); } private void nexus_lrooms(dataPacket packet) { String s = Hotel_.listRooms(); dataPacket d = new dataPacket(my_name_, packet.destination(), packet.contentType(), (new Integer(s.length())).toString(), s.toString()); wq_.nq(d); } private void nexus_nick(dataPacket packet) { Enumeration e = roomlist_.elements(); while(e.hasMoreElements()) writeRoom((Room)e.nextElement(), my_name_ + " is now known as " + packet.content()); my_name_ = new String(packet.content()); } private void nexus_leave(dataPacket packet) { Room r = Hotel_.getRoom(packet.content()); writeRoom(r, my_name_ + " has left the room " + packet.content()); if(r.delClient(this)) Hotel_.delRoom(r); roomlist_.removeElement(r); } private void nexus_quit(dataPacket packet) { Enumeration e = roomlist_.elements(); while(e.hasMoreElements()) { Room r = (Room)e.nextElement(); writeRoom(r, my_name_ + " has quit " ); r.delClient(this); } finished_ = true; } private void nexus_url(dataPacket packet) { try { URL u = new URL(packet.content()); // first extract the filename stripped of its path. int index = u.getFile().lastIndexOf("/"); String infilename = u.getFile().substring(index + 1); // next construct the name of the temporary file String outfilename = (System.getProperty("mywebdir") + "_" + packet.destination() + "." + infilename); // now the temporary URL assigned to this request String imageURL = new String(System.getProperty("mywebaddress") + "_" + packet.destination() + "." + infilename); // Open temporary file for writing FileOutputStream fout = new FileOutputStream(outfilename); // Now contact alien ship InputStream i = u.openStream(); byte[] buffer = new byte[1024]; // And download the image for(;;) { int num = i.read(buffer); if(num < 0) break; fout.write(buffer, 0, num); } fout.close(); i.close(); // Get room for which this request was issued Room r = Hotel_.getRoom(packet.destination()); // invalidate previous entry File f = new File(r.getLastImageName()); if(f.exists()) f.delete(); // add new image name r.putNextImageName(outfilename); writeRoom(r,"Asynchronously transferring image " + packet.content() + " from " + my_name_ ); dataPacket d = new dataPacket(my_name_, packet.destination(), packet.contentType(), (new Integer(imageURL.length())).toString(), imageURL); r.getQ().nq(d); // multicast this imageURL onto the room.. } catch(java.net.MalformedURLException ue) { System.out.println("warning:Invalid URL requested"); } catch(java.io.IOException e) { System.out.println("warning: IOException occurred"); } } // Sends a "system" message msg onto room r private void writeRoom(Room r, String msg) { StringBuffer sb = new StringBuffer(); sb.append("==>"); sb.append(msg); dataPacket d = new dataPacket(my_name_, r.getName() , "TEXT" , (new Integer(sb.length())).toString(), sb.toString()); r.getQ().nq(d); } public String getName() { return my_name_; } public MT_Bounded_Queue getQ() { return wq_; } }// ----------------------------------------------------------------------/** This class implements a room factory. getRoom returns an existing room, or else creates it and returns a reference to a new room. **/ class RoomFactory implements consts { private Vector Hotel_; public RoomFactory() { Hotel_ = new Vector(); } public synchronized Room getRoom(String name) { Enumeration e = Hotel_.elements(); while(e.hasMoreElements()) { Room r = (Room) e.nextElement(); if(r.getName().equals(name)) return r; } addRoom(name); return getRoom(name); } private synchronized void addRoom(String name) { Room r = new Room(name); Hotel_.addElement(r); } public synchronized void delRoom(Room r) { Hotel_.removeElement(r); } public synchronized String listRooms() { Enumeration e = Hotel_.elements(); StringBuffer sb = new StringBuffer(); while(e.hasMoreElements()) sb.append(" " + ((Room)e.nextElement()).getName() + " "); return sb.toString(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?