import java.util.*;
import java.net.*;
import java.io.*;
public class Connector {
ServerSocket listener;
Socket [] link;
public void Connect(String basename, int myId, int numProc,
BufferedReader[] dataIn,
PrintWriter[] dataOut) throws Exception {
Name myNameclient = new Name();
link = new Socket[numProc];/* Get as many sockets as # of processes */
int localport = getLocalPort(myId);/* create a serverSocket for myself */
listener = new ServerSocket(localport);
/* register in the name server */
myNameclient.insertName(basename + myId,
(InetAddress.getLocalHost()).getHostName(), localport);
/* accept connections from all the smaller processes */
for (int i = 0; i < myId; i++) {
Socket s = listener.accept();
BufferedReader dIn = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String getline = dIn.readLine();
StringTokenizer st = new StringTokenizer(getline);
int hisId = Integer.parseInt(st.nextToken());
int destId = Integer.parseInt(st.nextToken());
String tag = st.nextToken();
if (tag.equals("hello")) {
link[hisId] = s;
dataIn[hisId] = dIn;
dataOut[hisId] = new PrintWriter(s.getOutputStream());
}
}
/* contact all the bigger processes */
for (int i = myId + 1; i < numProc; i++) {
PortAddr addr;
do {
addr = myNameclient.searchName(basename + i);
Thread.sleep(100);
} while (addr.getportnum() == -1);
link[i] = new Socket(addr.gethostname(), addr.getportnum());
dataOut[i] = new PrintWriter(link[i].getOutputStream());
dataIn[i] = new BufferedReader(new
InputStreamReader(link[i].getInputStream()));
/* send a hello message to P_i */
dataOut[i].println(myId + " " + i + " " + "hello" + " " + "null");
dataOut[i].flush();
}
}
int getLocalPort(int id) {
return Symbols.ServerPort + 10 + id;
}
public void closeSockets(){
try {
listener.close();
for (int i=0;i<link.length; i++)
link[i].close();
} catch (Exception e) {System.err.println(e);}
}
}