Java Socket程式設計系列(三)開發支援單客戶端訪問的Server
例子來自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);
}
}
}
相關文章
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- Python socket的客戶端Python客戶端
- server端雙socket 設計方式Server
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- Windows10 VS2017 C++ Server Socket簡單伺服器端與客戶端WindowsC++Server伺服器客戶端
- 「完整案例」基於Socket開發TCP傳輸客戶端TCP客戶端
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- Java Socket程式設計Java程式設計
- Go gRPC 系列三:流式客戶端和服務端GoRPC客戶端服務端
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- Docker部署mysql並提供客戶端訪問DockerMySql客戶端
- HttpClient客戶端網路程式設計——高可用、高併發HTTPclient客戶端程式設計
- 開發JAXR客戶端客戶端
- 如何利用sockserver模組程式設計實現客戶端併發Server程式設計客戶端
- Java服務端和客戶端開發輔助工具UtilsJava服務端客戶端
- Apollo 4 客戶端 SDK 設計客戶端
- .net socket.io客戶端使用過程客戶端
- 客戶端(windows)訪問FTP伺服器遇到的問題(總結)客戶端WindowsFTP伺服器
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- java websocket 客戶端JavaWeb客戶端
- zookeeper的Java客戶端APIJava客戶端API
- socket程式設計中常見的概念問題!程式設計
- Kubernetes客戶端認證(三)—— Kubernetes使用CertificateSigningRequest方式簽發客戶端證書客戶端
- Java網路程式設計:QQ郵件傳送客戶端程式設計Java程式設計客戶端
- 每個Java開發人員應該知道的五種RESTful客戶端程式碼JavaREST客戶端
- ASP程式設計中Session物件失效的客戶端解決方法程式設計Session物件客戶端
- EVE-NG初次啟動及WEB客戶端訪問Web客戶端
- FastDFS-nginx外掛作為FastDFS客戶端訪問ASTNginx客戶端
- 騰訊 客戶端開發 QT客戶端QT
- Kubernetes官方java客戶端之三:外部應用Java客戶端
- 「美餐客戶端 3.0」設計過程客戶端
- 使用Apollo Server搭建GraphQL的服務端和客戶端Server服務端客戶端
- C# 客戶端程式呼叫外部程式的三種實現C#客戶端
- 001 Rust 網路程式設計,實現 TCP 服務端和客戶端程式Rust程式設計TCP服務端客戶端
- Java 程式設計開發Java程式設計
- Cisco Secure Client 5.1.6.103 (macOS, Linux, Windows & iOS, Andrord) - 遠端訪問客戶端clientMacLinuxWindowsiOS客戶端
- Zookeeper Java 客戶端搭建Java客戶端