Java Socket编程系列(三)开发支持单客户端访问的Server

来源:互联网 发布:artrage mac 中文 编辑:程序博客网 时间:2024/05/21 22:44

例子来自Java官方教程,稍作调整。

实现的是单个客户端请求服务端,根据服务端提示进行一系列操作。


协议类:

package com.dylan.socket;/** * @author xusucheng * @create 2017-12-24 **/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;    }}


服务器端:

package com.dylan.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * @author xusucheng * @create 2017-12-24 **/public class KnockKnockServer {    private static final int PORT = 8858;    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(PORT);                Socket clientSocket = serverSocket.accept();                PrintWriter out =                        new PrintWriter(clientSocket.getOutputStream(), true);                BufferedReader in = new BufferedReader(                        new InputStreamReader(clientSocket.getInputStream()));        ) {            String inputLine, outputLine;            // Initiate conversation with client            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;            }        } catch (IOException e) {            System.out.println("Exception caught when trying to listen on port "                    + PORT + " or listening for a connection");            System.out.println(e.getMessage());        }    }}



客户端:

package com.dylan.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;/** * @author xusucheng * @create 2017-12-24 **/public class KnockKnockClient {    private static final String HOST="127.0.0.1";    private static final int PORT=8858;    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(HOST, PORT);                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 " + HOST);            System.exit(1);        } catch (IOException e) {            System.err.println("Couldn't get I/O for the connection to " +                    HOST);            System.exit(1);        }    }}




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 贵州湄潭 湄潭茶叶价格 湄潭景区 湄潭茶海景区 湄潭绿茶 湄潭特产 湄潭家礼医院 湄潭茶叶品牌 湄潭樱花 湄潭在哪里 湄潭游玩 贵州湄潭翠芽价格 湄潭装修公司 湄潭鲜花店 遵义湄潭房价 湄潭茶城 湄潭纸箱厂 湄潭茶海 遵义湄潭茶叶 湄潭哪里好玩 湄潭翠芽多少钱 湄潭翠芽茶 湄潭茶 湄潭旅游景点 湄潭考驾照 湄潭翠芽价格表 贵州湄潭房价 湄潭职高 湄潭辅导班 贵阳到湄潭 湄潭美容院 湄潭到遵义 湄潭翠芽功效 湄潭房产网 湄潭二手房 湄潭家政 湄潭看守所 湄潭婚庆 湄潭在线网 湄潭企业 湄潭泡温泉