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);
}
}
}
相關文章
- Java Socket程式設計系列(四)開發支援多客戶端訪問的ServerJava程式設計客戶端Server
- Java Socket程式設計系列(二)開發帶回聲功能的Server和ClientJava程式設計Serverclient
- C++客戶端程式(socket)C++客戶端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- IE客戶客戶端程式開發的利器Bindows客戶端
- Java Socket程式設計系列(一)開發一次性會話的Server和ClientJava程式設計會話Serverclient
- 基於CMPP2.0的Socket客戶端(Java) - JAVA程式語言客戶端Java
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- Python socket的客戶端Python客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- 「完整案例」基於Socket開發TCP傳輸客戶端TCP客戶端
- 遠端客戶端 訪問 ASM 例項客戶端ASM
- 客戶端的socket是否需要bind?客戶端
- 客戶端訪問POP3--SMTP客戶端
- JAVA FTP客戶端問題JavaFTP客戶端
- 客戶端GUI程式開發漫談客戶端GUI
- 開發JAXR客戶端客戶端
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- 純java開發的電子郵件客戶端Java客戶端
- Docker部署mysql並提供客戶端訪問DockerMySql客戶端
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- Linux網路程式設計之socket簡單通訊--客戶端程式碼Linux程式設計客戶端
- Windows10 VS2017 C++ Server Socket簡單伺服器端與客戶端WindowsC++Server伺服器客戶端
- oracle客戶端連線server 端, tnsnames的三種設定方式Oracle客戶端Server
- 騰訊 客戶端開發 QT客戶端QT
- 限制訪問Oracle客戶端IP方法總結Oracle客戶端
- Java服務端和客戶端開發輔助工具UtilsJava服務端客戶端
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- ExchangeServer2010客戶端的安全訪問Server客戶端
- Java OAuth 2.0 客戶端程式設計(二): 客戶端憑據授權JavaOAuth客戶端程式設計
- java websocket 客戶端JavaWeb客戶端
- Jbpm3.2 開發HelloWorld (簡單請假流程)客戶端客戶端
- 用VB編寫OPC客戶端訪問WINCC (轉)客戶端
- .net socket.io客戶端使用過程客戶端
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+UDP伺服器客戶端】WindowsUDP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- zookeeper的Java客戶端APIJava客戶端API