View Javadoc

1   package org.xvsm.lookup.gnutella;
2   
3   import java.io.IOException;
4   import java.io.ObjectInputStream;
5   import java.io.ObjectOutputStream;
6   import java.net.InetSocketAddress;
7   import java.net.ServerSocket;
8   import java.net.Socket;
9   import java.net.SocketAddress;
10  import java.util.ArrayList;
11  import java.util.Random;
12  
13  /***
14   * Gnutella-Server, which provides the peers with lists of other peers.
15   * 
16   * @author Hannu-Daniel Goiss
17   */
18  public class GnutellaServer {
19  	public ArrayList<SocketAddress> peers = new ArrayList<SocketAddress>();
20  
21  	/***
22  	 * main function to start the Server usage: GnutellaServer <Port>
23  	 * 
24  	 * @param args
25  	 * @throws IOException
26  	 * @throws ClassNotFoundException
27  	 */
28  	public static void main(String[] args) throws IOException,
29  			ClassNotFoundException {
30  
31  		if (args.length != 1)
32  			System.err.println("usage: GnutellaServer <Port>");
33  
34  		new GnutellaServer(Integer.parseInt(args[0]));
35  	}
36  
37  	/***
38  	 * constructor, which starts the Server at a port specified by the parameter
39  	 * port. This function handles all the incoming requests of the peers.
40  	 * 
41  	 * @param port
42  	 * @throws IOException
43  	 * @throws ClassNotFoundException
44  	 */
45  	public GnutellaServer(int port) throws IOException, ClassNotFoundException {
46  		ServerSocket serverSocket = new ServerSocket(port);
47  
48  		while (true) {
49  			Socket socket = serverSocket.accept();
50  
51  			ObjectInputStream ois = new ObjectInputStream(socket
52  					.getInputStream());
53  			ObjectOutputStream oos = new ObjectOutputStream(socket
54  					.getOutputStream());
55  			int remotePort = (Integer) ois.readObject();
56  
57  			SocketAddress peer = new InetSocketAddress(socket.getInetAddress(),
58  					remotePort);
59  
60  			if (peers.contains(peer) == false) {
61  				peers.add(peer);
62  			}
63  
64  			if (peers.size() <= 1) {
65  				oos.writeObject(null);
66  			} else {
67  				ArrayList<SocketAddress> returnpeers = new ArrayList<SocketAddress>();
68  				boolean repeat = true;
69  				Random r = new Random(System.nanoTime());
70  				int start = r.nextInt(peers.size());
71  				int counter = start;
72  
73  				do {
74  					if (peer.equals(peers.get(counter)) == false) {
75  						returnpeers.add(peers.get(counter));
76  					}
77  					counter++;
78  					if (counter >= peers.size())
79  						counter = 0;
80  				} while (counter != start);
81  
82  				oos.writeObject(returnpeers);
83  			}
84  			socket.close();
85  		}
86  	}
87  }