在客户端 - 服务器JavaFx中使用观察者模式

时间:2015-04-30 12:19:10

标签: javafx client-server observer-pattern

作为研讨会,我被要求在文件上实施电话簿并使用设计模式。我选择了观察者。该实现是客户端 - 服务器。我创建了一个管理文件的服务器类。客户端与服务器通信,并且客户端线程注册到观察者。我的目标是每当有文件更新(删除,添加等)时,所有客户端的GUI刷新。 我想帮忙。

服务器类:

public class Server extends Application implements Observer {
//implements Observer 
private TextArea ta = new TextArea();
private int clientNo = 0;
private int flag = 0;
private int lockId;
private RandomAccessFile raf;
@SuppressWarnings("rawtypes")
private ArrayList<HandleAClient> clients;
private HandleAClient clientThread;
//Specify the size of five string fields in the record
final static int NAME_SIZE = 32;
final static int STREET_SIZE = 32;
final static int CITY_SIZE = 20;
final static int STATE_SIZE = 2;
final static int ZIP_SIZE = 5;
final static int RECORD_SIZE = (NAME_SIZE + STREET_SIZE 
        + CITY_SIZE + STATE_SIZE + ZIP_SIZE);
private int[] fromToSortChoices =
    { 0, NAME_SIZE, NAME_SIZE + STREET_SIZE ,
        NAME_SIZE + STREET_SIZE + CITY_SIZE ,
        NAME_SIZE + STREET_SIZE + CITY_SIZE + STATE_SIZE,
        NAME_SIZE + STREET_SIZE + CITY_SIZE + STATE_SIZE + ZIP_SIZE
    };
private Socket socket;
private ServerSocket serverSocket;
final static String fileName0 = "address0";
public static void main(String[] args)
{ launch(args);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void start(Stage primaryStage){
    // Open or create a random access file
    try
    { 
        raf = new RandomAccessFile(fileName0 + ".dat", "rw");
        raf.setLength(0);
        this.clients = new ArrayList<Server.HandleAClient>();
    }
    catch (IOException e1) 
    { System.out.print("Error: " + e1);
    System.exit(0);          
    }
    // Create a scene and place it in the stage
    Scene scene = new Scene(new ScrollPane(ta), 450, 200);
    primaryStage.setTitle("Server"); // Set the stage title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
    primaryStage.setAlwaysOnTop(true);
    primaryStage.setOnCloseRequest(e->{
        try{
            socket.close();
            serverSocket.close();
            Platform.exit();
            System.exit(0);
        }
        catch(Exception e1){
        }});

    new Thread( () ->{
        try {
            serverSocket = new ServerSocket(8000);
            Platform.runLater(() ->
            ta.appendText("Server started at " + new Date() + '\n'));
            while(true){
                socket = serverSocket.accept();
                clientNo++;
                Platform.runLater(() ->
                ta.appendText("Starting thread for client " + clientNo + " at " + new Date() + '\n'));

                InetAddress clientInetAddress = socket.getInetAddress();
                Platform.runLater(() ->{
                    ta.appendText("Client " + clientNo + "'s host name is " + clientInetAddress.getHostName() + "\n");
                    ta.appendText("Client " + clientNo + "'s IP Address is " + clientInetAddress.getHostAddress() + "\n");
                });

                clientThread = 
                        new HandleAClient(socket,clientNo);
                Thread t = new Thread(clientThread);
                clientThread.addObserver(Server.this);
                clients.add(clientThread);
                t.start();
            }
        }
        catch(IOException ex) {
            System.err.println(ex);
        }

    }).start();
}
class HandleAClient extends Observable implements Runnable {
    //extends Observable
    private Socket connectToClient; 
    private int id;
    private long currentPosition = 0;
    DataInputStream FromClient;
    DataOutputStream ToClient;
    public HandleAClient(Socket socket,int id) {
        this.connectToClient = socket;
        this.id = id;

    }

    public void run() {
        try {
            // Create data input and output streams
            FromClient = 
                    new DataInputStream(connectToClient.getInputStream());
            ToClient = 
                    new DataOutputStream(connectToClient.getOutputStream());
            currentPosition = raf.getFilePointer();
            ToClient.writeLong(currentPosition);
            long fromPosition = raf.getFilePointer() - 2 * RECORD_SIZE;
            long numberOfRecordsToCopy = 
                    (raf.length()- fromPosition) / (2 * RECORD_SIZE);
            long numberOfRecords;
            while (true) {
                System.out.println("server wait");
                //  synchronized (Thread.class) {
                ToClient.writeLong(raf.length());
                ToClient.flush();
                String type = FromClient.readUTF();
                switch (type) {
                case ("Clear"):
                {
                    raf.setLength(0);
                    setChanged();
                    notifyObservers();
                }
                break;
                case ("Add"):
                {                       
                    writeAddress(raf.length());
                    //currentPosition = raf.getFilePointer();
                    setChanged();
                    notifyObservers();
                    ToClient.writeLong(currentPosition);

                }
                break;
                case ("First"):
                {
                    System.out.println("server start first");
                    if (raf.length() > 0)   readAddress(0);
                    currentPosition = raf.getFilePointer();
                    ToClient.writeLong(currentPosition);
                    System.out.println("server done first");
                }
                break;
                case ("Next"):
                {
                    currentPosition = FromClient.readLong();
                    if (currentPosition < raf.length()) {
                        readAddress(currentPosition);}
                    currentPosition = raf.getFilePointer();
                    ToClient.writeLong(currentPosition);

                }
                break;
                case ("Previous"):
                {
                    currentPosition = FromClient.readLong();
                    if (currentPosition - 2 * 2 * RECORD_SIZE > 0)
                        readAddress(currentPosition - 2 * 2 * RECORD_SIZE);
                    else if (raf.length() > 0) readAddress(0);
                    currentPosition = raf.getFilePointer();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case ("Last"):
                {
                    long lastPosition = raf.length();
                    ToClient.writeLong(lastPosition);
                    if (lastPosition > 0)
                        readAddress(lastPosition - 2 * RECORD_SIZE);
                    currentPosition = raf.getFilePointer();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case ("Midst"):
                {
                    numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
                    ToClient.writeLong(numberOfRecords);
                    if (numberOfRecords > 0)
                        readAddress((numberOfRecords/2)*(2*RECORD_SIZE));
                    currentPosition = raf.getFilePointer();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case "Update":
                {
                    currentPosition = FromClient.readLong();
                    if (currentPosition > 0) {
                        currentPosition = currentPosition - 2*RECORD_SIZE;
                        ToClient.writeLong(currentPosition);}
                    writeAddress(currentPosition);
                    //currentPosition = raf.getFilePointer();
                    setChanged();
                    notifyObservers();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case "Delete":
                {
                    currentPosition = FromClient.readLong();
                    numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
                    ToClient.writeLong(numberOfRecords);
                    if (numberOfRecords == 0) {
                        currentPosition = raf.getFilePointer();
                        ToClient.writeLong(currentPosition);
                        return;
                    }
                    else if (numberOfRecords == 1) 
                    {
                        raf.setLength(0);
                        currentPosition = raf.getFilePointer();
                        ToClient.writeLong(currentPosition);
                        return;
                    }
                    fromPosition = currentPosition;
                    long toPosition = fromPosition - 2*RECORD_SIZE;
                    numberOfRecordsToCopy = (raf.length()- fromPosition) / (2 * RECORD_SIZE);
                    ToClient.writeLong(numberOfRecordsToCopy);
                    for (int i=0; i < numberOfRecordsToCopy; i++ )
                    { 
                        readAddress(fromPosition);
                        writeAddress(toPosition);
                        fromPosition += 2*RECORD_SIZE;
                        toPosition += 2*RECORD_SIZE;       
                    }
                    raf.setLength(raf.length() - 2*RECORD_SIZE);
                    ToClient.writeLong(raf.length());
                    readAddress(0);
                    currentPosition = raf.getFilePointer();
                    setChanged();
                    notifyObservers();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case "Insert":
                {
                    currentPosition = FromClient.readLong();
                    if (raf.length() == 0)
                    { 
                        writeAddress(raf.length());
                        ToClient.writeLong(raf.getFilePointer());
                        return;
                    }
                    fromPosition = currentPosition-2*RECORD_SIZE;
                    long currentFrom = raf.length() - 2*RECORD_SIZE; 
                    numberOfRecordsToCopy = (raf.length()- fromPosition) / (2 * RECORD_SIZE);
                    ToClient.writeLong(numberOfRecordsToCopy);
                    for (int i=0; i < numberOfRecordsToCopy; i++ )
                    { 
                        readAddress(currentFrom);
                        writeAddress(currentFrom + 2*RECORD_SIZE);
                        currentFrom -= 2*RECORD_SIZE;
                    }
                    writeAddress(fromPosition);
                    raf.setLength(raf.length() - 2*RECORD_SIZE);
                    readAddress(0);
                    currentPosition = raf.getFilePointer();
                    setChanged();
                    notifyObservers();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case "Duplicate":
                {
                    numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
                    ToClient.writeLong(numberOfRecords);
                    for (int i=0; i < numberOfRecords; i++ )
                    {
                        readAddress(i*2*RECORD_SIZE);
                        writeAddress(raf.length());  
                    }
                    if (numberOfRecords>0) readAddress(0);
                    setChanged();
                    notifyObservers();
                    ToClient.writeLong(currentPosition);
                }
                break;
                case "Sort":
                {
                    sortFile();
                    if (raf.length() > 0)   
                    {
                        readAddress(0);
                    }
                    setChanged();
                    notifyObservers();
                }
                break;
                }

                //}

                Platform.runLater(() ->{
                    ta.appendText("Done operation for client "+ this.id + "\n");
                });

            }
        }
        catch(IOException e) {
            System.err.println(e);
        }
    }


    private void sortFile() {
        try {
            int size = (int) (raf.length() / RECORD_SIZE / 2);
            int ascORdes, from, to, idx;
            raf.seek(0);
            if (raf.length() == 0) return ;
            ascORdes = FromClient.readBoolean() ? -1 : 1;
            String fileToSort[];
            fileToSort = new String[size];
            for (int i = 0; i < size;i++)
            { 
                fileToSort[i] = 
                        FixedLengthStringIO.readFixedLengthString(RECORD_SIZE, raf);
            }       
            idx  = FromClient.readInt();
            from = fromToSortChoices[idx];
            to   = fromToSortChoices[idx+1];
            HeapSortaORd.heapSortaORd(fileToSort, ascORdes, from, to);
            raf.seek(0);
            for (int i = 0; i < size;i++)
            { 
                FixedLengthStringIO.writeFixedLengthString(
                        fileToSort[i], RECORD_SIZE, raf);
            }       

        } 
        catch (IOException e) {
            e.printStackTrace();
        }

    }
    private void readAddress(long position) {
        try {
            raf.seek(position);
            String name = 
                    FixedLengthStringIO.readFixedLengthString(NAME_SIZE, raf);
            String street = 
                    FixedLengthStringIO.readFixedLengthString(STREET_SIZE, raf);
            String city = 
                    FixedLengthStringIO.readFixedLengthString(CITY_SIZE, raf);
            String state = 
                    FixedLengthStringIO.readFixedLengthString(STATE_SIZE, raf);
            String zip = 
                    FixedLengthStringIO.readFixedLengthString(ZIP_SIZE, raf);
            ToClient.flush();
            ToClient.writeUTF(name);
            ToClient.flush();
            ToClient.writeUTF(street);
            ToClient.flush();
            ToClient.writeUTF(city);
            ToClient.flush();
            ToClient.writeUTF(state);
            ToClient.flush();
            ToClient.writeUTF(zip);
            ToClient.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }



    }
    private void writeAddress(long position) {
        try
        {   raf.seek(position);
        String name = FromClient.readUTF();
        String street = FromClient.readUTF();
        String city = FromClient.readUTF();
        String state = FromClient.readUTF();
        String zip = FromClient.readUTF();
        FixedLengthStringIO.writeFixedLengthString(name 
                == null ? " " : name, NAME_SIZE, raf);
        FixedLengthStringIO.writeFixedLengthString(street 
                == null ? " " : street, STREET_SIZE, raf);
        FixedLengthStringIO.writeFixedLengthString(city 
                == null ? " " : city, CITY_SIZE, raf);
        FixedLengthStringIO.writeFixedLengthString(state 
                == null ? " " : state, STATE_SIZE, raf);
        FixedLengthStringIO.writeFixedLengthString(zip
                == null ? " " : zip, ZIP_SIZE, raf);
        }
        catch (IOException e1)
        { e1.printStackTrace();
        }

    }

}
@Override
public void update(Observable observable, Object object) {
    this.flag = 0;
    for (int i = 0; i < clients.size(); i++) {
        System.out.println("File changed. Client " + clients.get(i).id + " back to first");
        clients.get(i).currentPosition = 0;
    }

}

 }

客户端类:

public class Client extends Application
//extends Observable
 { // IO streams
    DataOutputStream toServer = null;
    DataInputStream fromServer = null;
Socket socket;
//Specify the size of five string fields in the record
final static int NAME_SIZE = 32;
final static int STREET_SIZE = 32;
final static int CITY_SIZE = 20;
final static int STATE_SIZE = 2;
final static int ZIP_SIZE = 5;
final static int RECORD_SIZE = (NAME_SIZE + STREET_SIZE 
        + CITY_SIZE + STATE_SIZE + ZIP_SIZE);
final static String fileName0 = "address0";
// Text fields
private TextField jtfName = new TextField();
private TextField jtfStreet = new TextField();
private TextField jtfCity = new TextField();
private TextField jtfState = new TextField(); 
private TextField jtfZip = new TextField();
// Buttons
private Button jbtAdd   = new Button("Add");
private Button jbtFirst   = new Button("First");
private Button jbtNext   = new Button("Next");
private Button jbtPrevious   = new Button("Previous");
private Button jbtLast   = new Button("Last");
private Button jbtMidst   = new Button("Midst");
private Button jbtUpdate   = new Button("Update");
private Button jbtDelete   = new Button("Delete");
private Button jbtInsert   = new Button("Insert");
private Button jbtClear   = new Button("Clear");
private Button jbtDuplicate   = new Button("Duplicate");
private Button jbtDoSort   = new Button("Perform Sort");
private GridPane jpSortPanel;
private RadioButton jrbSortDecsend;
private RadioButton jrbSortAcsend;
private ToggleGroup bgSortType;
private ObservableList<String> sortChoices =  
        FXCollections.observableArrayList(
                "Name",  "Street",  "City", "State", "Zip");
private GridPane mainPane =new GridPane();
@SuppressWarnings("rawtypes")
private ComboBox jcbSortChoices;
private DataOutputStream ToServer;
private DataInputStream FromServer;
private long fileLength;
private long currentPosition;
private long numberOfRecords;
private long numberOfRecordsToCopy;
private TextArea ta = new TextArea();
private int flag = 0;
@Override // Override the start method in the Application class
public void start(Stage primaryStage)
{

    /** Make scene and add to Application **/
    jtfName.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    jtfStreet.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    jtfCity.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    jtfState.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    jtfZip.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    // Panel jpAddress for holding labels & text fields
    GridPane jpAddress = new GridPane();
    String LabelColumn[]={"Name","Street","City"};
    Label l[]=new Label[LabelColumn.length];
    for(int i=0;i<LabelColumn.length;i++)
    { 
        l[i] = new Label(LabelColumn[i]);
        l[i].setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    }
    jpAddress.addColumn(0,l);
    // Panel jpStateZip for holding state and zip
    GridPane jpStateZip = new GridPane();
    jpStateZip.addRow(0, new Label("State"),jtfState,new Label("Zip"),jtfZip);
    // Panel p3 for holding jtfCity and jpStateZip
    GridPane p3 = new GridPane();
    p3.addRow(0, jtfCity,jpStateZip);
    growChildren(jpStateZip);
    growChildren(p3);
    jpAddress.addColumn(1, jtfName, jtfStreet,p3);
    // Set the panel with line border
    jpAddress.getStyleClass().add(
            "{ -fx-border-color: black;-fx-border-width: 5;}");
    growChildren(jpAddress);
    // Add buttons to a panel
    GridPane jpButton = new GridPane();
    HBox hb = new HBox();
    hb.getChildren().addAll(jbtAdd,jbtFirst,jbtNext,jbtPrevious,jbtLast,jbtMidst,jbtUpdate,jbtDelete,jbtInsert,jbtClear,jbtDuplicate);
    jpButton.addRow(0, hb);
    growChildren(jpButton);
    // Add jpAddress and jpButton to the mainPane
    mainPane.addColumn(0, jpAddress,jpButton,ta);
    /* ============ sort Panel ============ */
    jpSortPanel       = new GridPane();
    jrbSortAcsend     = new RadioButton("Ascending");
    jrbSortAcsend.setSelected(true);
    jrbSortDecsend    = new RadioButton("descending");
    jcbSortChoices    = new ComboBox<String>(sortChoices);
    jcbSortChoices.getSelectionModel().selectFirst();
    bgSortType        = new ToggleGroup();
    bgSortType.getToggles().addAll(jrbSortAcsend,jrbSortDecsend);
    jpSortPanel.addColumn(0, jrbSortAcsend,jrbSortDecsend,jcbSortChoices);
    growChildren(jpSortPanel);
    /* ========== end of sort panel ======= */
    jbtDoSort.setMaxWidth(Double.MAX_VALUE);
    mainPane.addColumn(1, jpSortPanel,jbtDoSort);
    growChildren(mainPane);

    try {
        socket = new Socket("localhost", 8000);
        // Create an input stream to receive data from the server
        FromServer = new DataInputStream(socket.getInputStream());
        // Create an output stream to send data to the server
        ToServer = new DataOutputStream(socket.getOutputStream());
        currentPosition = FromServer.readLong();
        primaryStage.setOnCloseRequest(e->{
            try{
                socket.close();
                Platform.exit();
                System.exit(0);

            }
            catch(Exception e1){
                e1.printStackTrace();
            }});

    }
    catch (IOException ex) {
        ex.printStackTrace();
    }

    jbtClear.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Clear");
            clearTextFields();
            currentPosition = 0;
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        System.out.println("client done clear");
    });
    jbtAdd.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Add");
            ToServer.writeUTF(jtfName.getText());
            ToServer.writeUTF(jtfStreet.getText());
            ToServer.writeUTF(jtfCity.getText());
            ToServer.writeUTF(jtfState.getText());
            ToServer.writeUTF(jtfZip.getText());
            currentPosition = FromServer.readLong();
            System.out.println("client done add");

        } catch (Exception e1) {
            e1.printStackTrace();
        }
    });
    jbtFirst.setOnAction(e ->
    {   
        System.out.println("client start first");
        try {
            first();
            System.out.println("client done first");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtNext.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Next");
            ToServer.writeLong(currentPosition);
            if (currentPosition < fileLength) {

                readAddress();}
            currentPosition = FromServer.readLong();

            System.out.println("client done next");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtPrevious.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Previous");
            ToServer.writeLong(currentPosition);
            if (currentPosition - 2 * 2 * RECORD_SIZE > 0)
                readAddress();
            else if (fileLength > 0) readAddress();
            currentPosition = FromServer.readLong();
            System.out.println("client done previous");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtLast.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Last");
            long lastPosition = FromServer.readLong();
            if (lastPosition > 0)
                readAddress();
            currentPosition = FromServer.readLong();
            System.out.println("client done last");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtMidst.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Midst");
            numberOfRecords = FromServer.readLong();
            if (numberOfRecords > 0)
                readAddress();
            currentPosition = FromServer.readLong();
            System.out.println("client done midst");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtUpdate.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Update");
            ToServer.writeLong(currentPosition);
            if (currentPosition > 0) 
                currentPosition = FromServer.readLong();
            ToServer.writeUTF(jtfName.getText());
            ToServer.writeUTF(jtfStreet.getText());
            ToServer.writeUTF(jtfCity.getText());
            ToServer.writeUTF(jtfState.getText());
            ToServer.writeUTF(jtfZip.getText());
            currentPosition = FromServer.readLong();
            System.out.println("client done update");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtDelete.setOnAction(e ->
    {   try {
        fileLength = FromServer.readLong();
        ToServer.writeUTF("Delete");
        ToServer.writeLong(currentPosition);
        numberOfRecords = FromServer.readLong();
        if (numberOfRecords == 0) {
            currentPosition = FromServer.readLong();
            return;
        }
        else if (numberOfRecords == 1) 
        { 
            clearTextFields();
            currentPosition = FromServer.readLong();
            return;
        }
        numberOfRecordsToCopy = FromServer.readLong();
        for (int i=0; i < numberOfRecordsToCopy; i++ )
        { 
            readAddress();
            ToServer.writeUTF(jtfName.getText());
            ToServer.writeUTF(jtfStreet.getText());
            ToServer.writeUTF(jtfCity.getText());
            ToServer.writeUTF(jtfState.getText());
            ToServer.writeUTF(jtfZip.getText());
        }
        fileLength = FromServer.readLong();
        readAddress();
        currentPosition = FromServer.readLong();
        System.out.println("client done delete");
    }catch (Exception e1) {
        e1.printStackTrace();
    }

    });
    jbtInsert.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Insert");
            ToServer.writeLong(currentPosition);
            if (fileLength == 0)
            { 
                ToServer.writeUTF(jtfName.getText());
                ToServer.writeUTF(jtfStreet.getText());
                ToServer.writeUTF(jtfCity.getText());
                ToServer.writeUTF(jtfState.getText());
                ToServer.writeUTF(jtfZip.getText());
                currentPosition = FromServer.readLong();
                System.out.println("client done insert");
                return;
            }
            String recordToInsert[] = { jtfName.getText(), jtfStreet.getText(), jtfCity.getText(),
                    jtfState.getText(), jtfZip.getText()};
            numberOfRecordsToCopy = FromServer.readLong(); 
            for (int i=0; i < numberOfRecordsToCopy; i++ )
            { 
                readAddress();
                ToServer.writeUTF(jtfName.getText());
                ToServer.writeUTF(jtfStreet.getText());
                ToServer.writeUTF(jtfCity.getText());
                ToServer.writeUTF(jtfState.getText());
                ToServer.writeUTF(jtfZip.getText());                        
            }
            //readAddress();
            jtfName.setText(recordToInsert[0]);
            jtfStreet.setText(recordToInsert[1]);
            jtfCity.setText(recordToInsert[2]);
            jtfState.setText(recordToInsert[3]);
            jtfZip.setText(recordToInsert[4]);
            ToServer.writeUTF(jtfName.getText());
            ToServer.writeUTF(jtfStreet.getText());
            ToServer.writeUTF(jtfCity.getText());
            ToServer.writeUTF(jtfState.getText());
            ToServer.writeUTF(jtfZip.getText());
            readAddress();
            currentPosition = FromServer.readLong();
            System.out.println("client done insert");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtDuplicate.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Duplicate");
            //ToServer.writeLong(currentPosition);
            numberOfRecords = FromServer.readLong(); 
            for (int i=0; i < numberOfRecords; i++ )
            {
                readAddress();
                ToServer.writeUTF(jtfName.getText());
                ToServer.writeUTF(jtfStreet.getText());
                ToServer.writeUTF(jtfCity.getText());
                ToServer.writeUTF(jtfState.getText());
                ToServer.writeUTF(jtfZip.getText()); 
            }
            if (numberOfRecords>0) readAddress();
            currentPosition = FromServer.readLong();
            System.out.println("client done duplicate");
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    });
    jbtDoSort.setOnAction(e ->
    {   
        try {
            fileLength = FromServer.readLong();
            ToServer.writeUTF("Sort");
            ToServer.writeBoolean(jrbSortDecsend.isSelected());
            ToServer.writeInt(jcbSortChoices.getSelectionModel().getSelectedIndex());
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        if (fileLength > 0) readAddress();
        System.out.println("client done sort");

    });

    /** Add to details and run Application **/
    Scene scene = new Scene (mainPane, -100, -100);
    primaryStage.setTitle("Complex Address System"); // Set the window title
    primaryStage.setScene(scene); // Place the scene in the window
    primaryStage.setAlwaysOnTop(true);
    primaryStage.show(); // Display the window
    primaryStage.setOnCloseRequest( new EventHandler<WindowEvent>(){
        public void handle(WindowEvent event){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.exit(0);
        }
    }); 
}

private void first() {
    try {
        fileLength = FromServer.readLong();
        ToServer.writeUTF("First");
        ToServer.flush();
        if (fileLength > 0) readAddress();
        currentPosition = FromServer.readLong();
    } catch (Exception e1) {
        e1.printStackTrace();
    }

}

@SuppressWarnings("static-access")
private void growChildren(GridPane pane)
{ pane.getChildren().forEach(chiled ->
{   pane.setHgrow(chiled, Priority.ALWAYS);
pane.setVgrow(chiled, Priority.ALWAYS);
});
}

private void readAddress() {

    try {
        String name = FromServer.readUTF();
        String street = FromServer.readUTF();
        String city = FromServer.readUTF();
        String state = FromServer.readUTF();
        String zip = FromServer.readUTF();
        jtfName.setText(name);
        jtfStreet.setText(street);
        jtfCity.setText(city);
        jtfState.setText(state);
        jtfZip.setText(zip);
    } catch (IOException e) {
        e.printStackTrace();
    }

}
private void clearTextFields() {
    jtfName.setText(null);
    jtfStreet.setText(null);
    jtfCity.setText(null);
    jtfState.setText(null);
    jtfZip.setText(null);
}
public static void main(String[] args)
{ launch(args);
}

}

0 个答案:

没有答案