diff --git a/cs654/proj1/KaZaServer.java b/cs654/proj1/KaZaServer.java index 9437100..8d3364f 100644 --- a/cs654/proj1/KaZaServer.java +++ b/cs654/proj1/KaZaServer.java @@ -8,6 +8,7 @@ public class KaZaServer implements Runnable public static final int LISTEN_PORT = 3442; private ServerSocket m_serverSocket; private HashMap m_clientData; + private Vector m_peerGroupLeaders; public void run() { @@ -77,6 +78,7 @@ public class KaZaServer implements Runnable BufferedReader br = new BufferedReader( new InputStreamReader( m_socket.getInputStream())); + DataOutputStream os = new DataOutputStream(socket.getOutputStream); /* loop processing client messages */ for (;;) @@ -101,25 +103,66 @@ public class KaZaServer implements Runnable { /* user is giving us a description of a file */ String fileName = inLine.substring(5); - String fileDesc = ""; - boolean first = true; - for (;;) - { - String descLine = br.readLine(); - if (descLine.equals(".")) - break; - if (!first) - fileDesc += "\n"; - fileDesc += descLine; - first = false; - } + String fileDesc = br.readLine(); synchronized (m_clientData) { m_clientInfo.files.put(fileName, fileDesc); } } + else if (opCode.equals("SRCH")) + { + /* user is requesting a search */ + if (tokens.hasMoreTokens()) + { + int depth = Integer.parseInt(tokens.nextToken()); + if (tokens.hasMoreTokens()) + { + String query = tokens.nextToken(); + String searchResults = performSearch(depth, query); + os.write(searchResults.getBytes(); + } + } + } } } catch (Exception e) { } } } + + private String performSearch(int depth, String query) + { + String results = ""; + if (depth > 0) + { + synchronized (m_peerGroupLeaders) + { + for (Socket s : m_peerGroupLeaders) + { + String peerResults = + getSearchResultsFromPeerGroupLeader(s, depth-1, query); + results += peerResults; + } + } + } + + /* now search my own file list */ + } + + private String getSearchResultsFromPeerGroupLeader(Socket s, int depth, String query) + { + BufferedReader br = new BufferedReader( + new InputStreamReader( + s.getInputStream())); + DataOutputStream os = new DataOutputStream(s.getOutputStream()); + + os.write("SRCH " + depth + " " + query); + String searchResults = ""; + for (;;) + { + String inLine = br.readLine(); + if (inLine.equals(".")) + break; + searchResults += inLine + "\n"; + } + return searchResults; + } }