gpt4 book ai didi

java - 为什么这个基本的客户端-服务器程序不传递数据?

转载 作者:行者123 更新时间:2023-12-01 14:42:28 25 4
gpt4 key购买 nike

我正在关注网络方面的 Java Trail。当我将用作示例的三个 KnockKnock 类(客户端、服务器和协议(protocol))复制/粘贴到 Eclipse 中时,它们按预期工作。然而,我真正想做的是消除协议(protocol)类,让服务器回显给客户端,无论我在控制台中输入什么内容。我尝试主要通过注释掉对协议(protocol)类的引用来修改服务器程序,但不知何故,我最终破坏了程序。

我太新了,我不知道哪里出了问题,而且我在电子书和网站上搜索答案越多,我就越困惑。我发现我对 IO 流的真正工作原理几乎一无所知。我按顺序粘贴了以下所有三个类:服务器、客户端、协议(protocol)。问题出在哪里以及为什么会出现问题:

服务器:

import java.net.*;
import java.io.*;

public class KnockKnockServer {
public static void main(String[] args) throws IOException {

ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}

Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
System.out.println("Client Accepted");
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.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);
out.println(inputLine);
if (inputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}

客户:

import java.io.*;
import java.net.*;

public class KnockKnockClient {
public static void main(String[] args) throws IOException {

Socket kkSocket = null;
PrintWriter out = null;
BufferedReader in = null;

try {
kkSocket = new Socket("localhost", 4444);
out = new PrintWriter(kkSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: taranis.");
System.exit(1);
}

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);
}
}

out.close();
in.close();
stdIn.close();
kkSocket.close();
}
}

协议(protocol):

import java.net.*;
import java.io.*;

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;
}
}

最佳答案

我认为你的问题只是两个应用程序都在等待:当KKServer启动时,它会等待客户端,然后等待客户端“说”一些话,客户端等待服务器说一些话,然后再等待用户输入

关于java - 为什么这个基本的客户端-服务器程序不传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com