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

来源:互联网 发布:贵州大数据发展现状 编辑:程序博客网 时间:2024/06/04 20:07

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

上一篇介绍了单客户端访问的Server实现,这一篇实现的是多个客户端请求服务端,根据服务端提示进行一系列操作。


协议类(和系列三一样没变):

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.IOException;import java.net.ServerSocket;/** * @author xusucheng * @create 2017-12-24 **/public class KKMultiServer {    private static final int PORT = 8858;    public static void main(String[] args) {        boolean listening = true;        try (ServerSocket serverSocket = new ServerSocket(PORT)) {            while (listening) {                new KKMultiServerThread(serverSocket.accept()).start();            }        } catch (IOException e) {            System.err.println("Could not listen on port " + PORT);            System.exit(-1);        }    }}


服务器多线程类(核心):

package com.dylan.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * @author xusucheng * @create 2017-12-24 **/public 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();        }    }}


客户端:

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博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 南方澳跨海大桥 港珠澳 澳优能力多 澳洋顺昌 动态澳 港珠澳海底隧道 澳邮中国快运 锐澳鸡尾酒 美澳健 rio锐澳鸡尾酒 澳邮快运 台湾南方澳大桥 港珠澳跨海大桥全长 港珠澳跨海大桥海底隧道 澳乐 澳乐玩具 澳亚国际9661登录 澳亚国际快速充值 辽宁大学亚澳商学院 澳亚国际手机版 澳亚国际aoya188 澳优爱优 澳优能力多氨基酸事件 澳优股票 澳优海普诺凯 澳优优选 澳优海普诺凯怎么样 澳优标志 澳优乳业股份有限公司 澳优股价 澳优怎么样 澳优1938美纳多价格 澳优有机能力多价格 澳优1938美纳多 澳优1897 澳优代理 澳优公司 澳优能力多是进口的吗 澳优能力多好不好 澳优多少钱一罐 澳优能力