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 }