集册 Java实例教程 敲打客户机和服务器

敲打客户机和服务器

欢马劈雪     最近更新时间:2020-01-02 10:19:05

473
敲打客户机和服务器

import java.net.*;

import java.io.*;


public class KKMultiServer {/*nowjava.com - 时代Java 提 供*/

    public static void main(String[] args) throws IOException {


        if (args.length != 1) {

            System.err.println("Usage: java KKMultiServer <port number>");

            System.exit(1);

        }


        int portNumber = Integer.parseInt(args[0]);

        boolean listening = true;


        try (ServerSocket serverSocket = new ServerSocket(portNumber)) {

            while (listening) {

                new KKMultiServerThread(serverSocket.accept()).start();
                /**
                时代Java公众号
                **/

            }

        } catch (IOException e) {

            System.err.println("Could not listen on port " + portNumber);

            System.exit(-1);

        }

    }

}


class KKMultiServerThread extends Thread {

    private Socket socket = null;


    public KKMultiServerThread(Socket socket) {

        super("KKMultiServerThread");

        this.socket = socket;

    }


    public void run() {


        try (PrintWriter out = new PrintWriter(socket.getOutputStream(),

                true);

                BufferedReader in = new BufferedReader(

                        new InputStreamReader(socket.getInputStream()));) {

            String inputLine, outputLine;

            KnockKnockProtocol kkp = new KnockKnockProtocol();

            outputLine = kkp.processInput(null);

            out.println(outputLine);


            while ((inputLine = in.readLine()) != null) {

                outputLine = kkp.processInput(inputLine);

                out.println(outputLine);

                if (outputLine.equals("Bye"))

                    break;

            }

            socket.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}


/*

 * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.

 *

 * Redistribution and use in source and binary forms, with or without

 * modification, are permitted provided that the following conditions

 * are met:

 *

 *   - Redistributions of source code must retain the above copyright

 *     notice, this list of conditions and the following disclaimer.

 *

 *   - Redistributions in binary form must reproduce the above copyright

 *     notice, this list of conditions and the following disclaimer in the

 *     documentation and/or other materials provided with the distribution.

 *

 *   - Neither the name of Oracle or the names of its

 *     contributors may be used to endorse or promote products derived

 *     from this software without specific prior written permission.

 *

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS

 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR

 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 */


---

HTML


<p>KnockKnockClient.java</p>


---

Code


import java.io.*;

import java.net.*;


public class KnockKnockClient {

    public static void main(String[] args) throws IOException {


        if (args.length != 2) {

            System.err

                    .println("Usage: java EchoClient <host name> <port number>");

            System.exit(1);

        }


        String hostName = args[0];

        int portNumber = Integer.parseInt(args[1]);


        try (Socket kkSocket = new Socket(hostName, portNumber);

                PrintWriter out = new PrintWriter(

                        kkSocket.getOutputStream(), true);

                BufferedReader in = new BufferedReader(

                        new InputStreamReader(kkSocket.getInputStream()));) {

            BufferedReader stdIn = new BufferedReader(

                    new InputStreamReader(System.in));

            String fromServer;

            String fromUser;


            while ((fromServer = in.readLine()) != null) {

                System.out.println("Server: " + fromServer);

                if (fromServer.equals("Bye."))

                    break;


                fromUser = stdIn.readLine();

                if (fromUser != null) {

                    System.out.println("Client: " + fromUser);

                    out.println(fromUser);

                }

            }

        } catch (UnknownHostException e) {

            System.err.println("Don't know about host " + hostName);

            System.exit(1);

        } catch (IOException e) {

            System.err.println("Couldn't get I/O for the connection to "

                    + hostName);

            System.exit(1);

        }

    }

}


/*

 * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.

 *

 * Redistribution and use in source and binary forms, with or without

 * modification, are permitted provided that the following conditions

 * are met:

 *

 *   - Redistributions of source code must retain the above copyright

 *     notice, this list of conditions and the following disclaimer.

 *

 *   - Redistributions in binary form must reproduce the above copyright

 *     notice, this list of conditions and the following disclaimer in the

 *     documentation and/or other materials provided with the distribution.

 *

 *   - Neither the name of Oracle or the names of its

 *     contributors may be used to endorse or promote products derived

 *     from this software without specific prior written permission.

 *

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS

 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR

 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 */


---

HTML


<p>KnockKnockProtocol.java</p>


---

Code


import java.net.*;

import java.io.*;


public class KnockKnockProtocol {

    private static final int WAITING = 0;

    private static final int SENTKNOCKKNOCK = 1;

    private static final int SENTCLUE = 2;

    private static final int ANOTHER = 3;


    private static final int NUMJOKES = 5;


    private int state = WAITING;

    private int currentJoke = 0;


    private String[] clues = { "Turnip", "Little Old Lady", "Atch", "Who",

            "Who" };

    private String[] answers = { "Turnip the heat, it's cold in here!",

            "I didn't know you could yodel!", "Bless you!",

            "Is there an owl in here?", "Is there an echo in here?" };


    public String processInput(String theInput) {

        String theOutput = null;


        if (state == WAITING) {

            theOutput = "Knock! Knock!";

            state = SENTKNOCKKNOCK;

        } else if (state == SENTKNOCKKNOCK) {

            if (theInput.equalsIgnoreCase("Who's there?")) {

                theOutput = clues[currentJoke];

                state = SENTCLUE;

            } else {

                theOutput = "You're supposed to say \"Who's there?\"! "

                        + "Try again. Knock! Knock!";

            }

        } else if (state == SENTCLUE) {

            if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) {

                theOutput = answers[currentJoke] + " Want another? (y/n)";

                state = ANOTHER;

            } else {

                theOutput = "You're supposed to say \""

                        + clues[currentJoke] + " who?\""

                        + "! Try again. Knock! Knock!";

                state = SENTKNOCKKNOCK;

            }

        } else if (state == ANOTHER) {

            if (theInput.equalsIgnoreCase("y")) {

                theOutput = "Knock! Knock!";

                if (currentJoke == (NUMJOKES - 1))

                    currentJoke = 0;

                else

                    currentJoke++;

                state = SENTKNOCKKNOCK;

            } else {

                theOutput = "Bye.";

                state = WAITING;

            }

        }

        return theOutput;

    }

}


/*

 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.

 *

 * Redistribution and use in source and binary forms, with or without

 * modification, are permitted provided that the following conditions

 * are met:

 *

 *   - Redistributions of source code must retain the above copyright

 *     notice, this list of conditions and the following disclaimer.

 *

 *   - Redistributions in binary form must reproduce the above copyright

 *     notice, this list of conditions and the following disclaimer in the

 *     documentation and/or other materials provided with the distribution.

 *

 *   - Neither the name of Oracle or the names of its

 *     contributors may be used to endorse or promote products derived

 *     from this software without specific prior written permission.

 *

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS

 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,

 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR

 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 */


---

HTML


<p>KnockKnockServer.java</p>


---

Code


import java.net.*;

import java.io.*;


public class KnockKnockServer {

    public static void main(String[] args) throws IOException {


        if (args.length != 1) {

            System.err

                    .println("Usage: java KnockKnockServer <port number>");

            System.exit(1);

        }


        int portNumber = Integer.parseInt(args[0]);


        try (ServerSocket serverSocket = new ServerSocket(portNumber);

                Socket clientSocket = serverSocket.accept();

                PrintWriter out = new PrintWriter(

                        clientSocket.getOutputStream(), true);

                BufferedReader in = new BufferedReader
展开阅读全文