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); } }}
阅读全文